Indexer in C#, Zugriff in MC++


Thomas Wölfer
Thomas Wölfer

23. Januar 2005


Manche Problemlösungen sind so einfach, das man sich stundenlang damit beschäftigen kann herauszufinden, wie sie funktionieren: Das nennt man dann wohl Betriebsblindheit.

Indexer in Managed C++ sind gut dokumentiert. Im Wesentlichen läuft es bei einem Indexer darauf hinaus, das man in einer C++ Klasse einen Zugriffsmechanismus implementieren will, der im Managed C# oder VB Code dann zum indizieren verwendet werden kann. Angenommen, man hat eine Klasse (im MC++) die ein Array aus Strings kapselt, und man möchte von C# darauf per Array-Notation (  string temp = obj[i]; ) zugreifen. Dazu definiert man den Indexer in MC++ wie folgt:

[System::Reflection::DefaultMemberAttribute(S"Item")]
public __gc class MyCollection
{
  __property String* get_Item(int index);
};

Fein, das ist einfach. (Wer auch per Array-Notation reinschreiben will, braucht eine passende get_Item Methode.)

Nun hatte ich aber genau den anderen Fall. Im Code gibts eine Polygon-Klasse (XPolygon2d) die in C# definiert ist, und die einen Indexer zur Verfügung stellt. Das Polygon setzt sich aus Punkten vom Typ XPoint2d zusammen, und so ein Punkt wird dann beim Zugriff per Indexer geliefert. Das sieht als etwa so aus:

public XPoint2d this[ int n]
{
 
get
 
{
    
return( m_Points[ n]);
  }
}

Nun gibts eine weitere Klasse im MC++ Code, die so ein Polygon übergeben bekommt und auf die Punkte darin zugreifen muss. Mein Problem: Wie zum Henker muss man das nun hinschreiben? Es hat ganz schön gedauert bis ich drauf gekommen bin, dabei ist die Lösung total einfach - man greift einfach genauso drauf zu, als würde es sich um einen Zugriff auf einen Indexer handeln, der in MC++ definiert wurde. Eigentlich völlig logisch :-)

void AddPolygon( XPolygon2d* polygon)
{
  
int iPoly=0;
   XPoint2d point = polygon->get_Item( iPoly);
}