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! 🙂


Anmelden zum Antworten