Operator[] für eigene Map-Klasse ueberladen
-
Hi,
ich hab eine eigene Klasse Map, welche einen zweidimensionalen Array(Array of pointers to arrays) enthällt.class SMap { private: class MapTile { private: int Terrain; public: MapTile(); virtual ~MapTile(); }; int Width; int Height; MapTile** Map; public: SMap(int width, int height); virtual ~SMap(); };
Nun möchte ich den operator [] so ueberladen, dass
Map mymap; mymap[4][2] = someMapTile;
oder
mymap[5][7]->Terrain = 3;
möglich ist.
Ich möchte also mittels des Operators [] auf meine Map wie auf ein Array zugreifen können.
Leider habe ich absolut keine Ahnung, wie ich den Operator[] dazu ueberladen muss.
Ich habe hier im Forum nur einen Tread gefunden, der auf einen anderen verweist, welcher nicht mehr existiert..
Ich bin für jede Hilfe dankbar!!!
-
der operator [] der map muss ein "proxyobjekt" zurückgeben, welches wiederum den op[] implementiert hat. erst dieses objekt gibt dann das MapTile zurück.
der op[] sähe dann irgendwie so aus:
//erst das proxy objekt class Proxy{ private: MapTile* tiles; public: Proxy(MapTile* tiles):tiles(tiles){} MapTile& operator[](std::size_t pos){ return tiles[pos]; } }; //der op[] Proxy SMap::operator[](std::size_t pos){ return Proxy(Map[pos]); }
einfacher wärs aber direkt std::vector<std::vector<MapTile> > für das array zu verwenden, der op[] von SMap würde dann so aussehen:
std::vector<MapTile>& SMap::operator[](std::size_t pos){ return Map[pos]; }
-
Danke otze, das mit der Proxy-Klasse funktioniert!
Aber gibt es keine Möglichkeit, das Ganze ohne eine Proxy-Klasse und ohne vector hinzukriegen? Mir gefällt nämlich die zusätzliche Klasse eigendlich nicht...
-
Ui, das funktioniert doch nicht!! ich krieg jetzt die Fehlermeldung:
: error C2440: 'initializing' : cannot convert from 'class SMap::Proxy' to 'class SMap::MapTile' No constructor could take the source type, or constructor overload resolution was ambiguous
In der Zeile:
SMap::MapTile te = SomeMap[x][y];
-
dann mal die triviale lösung:
MapTile* SMap::operator[](std::size_t pos){ return Map[pos] }
*schnell ausrede einfallen lass, wieso mir das nicht sofort eingefallen ist*
ich arbeite nicht gerne mit freien zeigern
*puuuh nochmal glück gehabt*
-
Was heißt das std::size_t??
Welchen header muss ich dafür einbinden?
-
std::size_t hab ich gefunden, aber jetzt bekomme ich zur Laufzeit eine Fehlermeldung access violation in der Zeile:
return Map[pos]
Map ist hier aufeinmal null geworden und ich habe keine Ahnung, warum.
-
Ui, ich glaub ich habs... Der Fehler lag woanders.. Danke für die Lösung!