class array global definieren



  • ich habe ein problem, und zwar habe ich mir eine klasse "Map" erstellt welche unter anderem die variablen "bool inBenutzung" und "int ID" beinhaltet. das problem is folgendes : ich sage in der "main.cpp"

    Map Map1;
    

    und dann möchte ich davon ein array erstellen. in der "showMap();" funktion sagte ich :

    void InOutput::ShowMap(int mapwidth, int mapheight, Map mapnum(da is die Map1), Player playernum)
    {
    	for (int y = 0; y < mapwidth; y++)
    	{
    		for (int x = 0; x < mapheight; x++)
    		{
    			if (mapnum[y][x].inBenuzung == true)
    			{
                                  cout << "X";
                            }
                            else
                            {
                                  cout << ".";
                            }
    		}
    	}
    };
    

    er sagt mir aber dass ich den "[]" operator nicht verwenden kann.
    wie kann ich dass lösen?



  • Ich verstehe nur Bahnhof. Du kannst deine Map1 nicht als 2d Array nutzen. Wenn du das willst, musst du in deiner Klasse Map den operator() überladen. Die Frage ist, ob du das wirklich brauchst. Sag mal genau, was du vorhast (nicht wie du es vorhast), und zeig die Klassendefinition.



  • würde es gehen wenn ich dir das project sende?



  • WhileTrueDo schrieb:

    würde es gehen wenn ich dir das project sende?

    Ne, wir posten immmer hier im Forum. Wir posten immer nur Minimalbeispiele, das die Fehler/das Problem reproduziert. So hast du am meisten Chancen, dein Problem zu lösen.



  • also was ich machen möchte ist, ich will ein 3D array erstellen. dass soll meine Map bilden.



  • WhileTrueDo schrieb:

    also was ich machen möchte ist, ich will ein 3D array erstellen. dass soll meine Map bilden.

    3D, also x,y,z? Also map[x][y][z]? Vom Typ bool?



  • sry natürlich 2D 😉



  • Wie groß ist x und y? Immer gleich groß? Oder dynamisch? Zeig mal die Klasse Map



  • class Map
    {
    public  :
    	Map();
        void createBlock(Map mapnum);
    	void deleteBlock(Map mapnum, Player playernumber);
    	void clearMap(Map mapnum,int mapwidth , int mapheight);
    
    	bool InUse;
    	int  ID;
    	int  MapWidth;
    	int  MapHeight;
    };
    
    Map::Map()
    {
    	MapWidth  = 79;
    	MapHeight = 23;
    };
    

  • Mod

    Und wo ist da die 2D-Struktur? Oder überhaupt irgendwelche Nutzdaten?

    Wieso nimmst du nicht die fertigen Datenstrukturen der Standardbibliothek? Klingt so, als suchtest du vector, array, map oder eine Kombination davon.



  • ich will einfach nur ein 2D array auf dass ich überall durch instanzen zugreifen kann



  • Also du willst sowas, wenn ich es richtig verstanden habe?

    class Map
    {
    private:
    	bool data[79*23];
    public:
    	const bool& operator()(unsigned x, unsigned y) const {return data[x*23 + y];}
    	      bool& operator()(unsigned x, unsigned y)       {return data[x*23 + y];}
    };
    
    int main()
    {
    	Map mapnum;
    
    	if ( mapnum(3,4) ) // Entspricht: if ( mapnum[3]4] ) und das == true kannst du dir sparen.
    	{
    		// ...
    	}
    }
    


  • in der main schreibe ich :

    Map Map1;
    
    int main()
    {
    showmap(Map1);
    getinput(input1*/nicht so wichtig/*);
    runfunktion(Map1);
    }
    

    und in der map.hpp :

    void showmap(Map mapnum);
    

    und dann in der map.cpp

    void showmap(Map mapnum)
    {
    mapnum[x][y].mach dass und dass
    };
    

    aber ich weiss nicht wie ich das mit dem array regeln soll da diese variante nicht funktioniert



  • Tut mir , aber ich blicks nicht. SeppJ übernimmt das jetzt :D, und ich geh schlafen. 🤡



  • Wenn du eine eigene Klasse schreibst kannst du ohne Probleme den operator[] überladen. Aber einen operator[][], wie du ihn haben möchtest, gibt es nicht. (Vllt kann da einer von den Gurus irgendwie tricksen, aber das hilft dir nicht weiter, da du beim kleinsten Fehler wahrscheinlich schon nicht wüsstest, was wie wo nicht geht oder kaputt ist.)

    Zumal du auch eh eher einen C-lastigen Ansatz hast.
    Mach es wie out vorgeschlagen hat und überlade den operator(), dann schreibst du halt statt: map[x][y] nur map(x, y)



  • Hallo,

    2D Indexoperatoren kann man über eine Proxyklasse realisieren. Man gibt dann einfach im Indexoperator diese Proxyklasse zurück die wiederum selbst einen überladenen Indexoperatur hat.
    Erklärung z. Bsp. hier
    http://www.c-plusplus.net/forum/232303-full



  • Schon mal was von einem Proxy-Objekt gehört?

    #include <cstddef>
    
    class Map
    {
    private:
        bool data[79*23];
    
        template<typename ValT>
        class proxy
        {
        	ValT* arr;
    
        	friend class Map;
    
        	proxy( ValT* arr ):
    			arr{arr} {}
    
    	public:
    
    		ValT& operator[]( std::size_t i ) { return arr[i]; }
        };
    
    public:
    
    	Map() : data{} {}
    
        proxy<const bool> operator[]( std::size_t x ) const { return proxy<const bool>{ data + x*23 }; }
        proxy<bool>       operator[]( std::size_t x )       { return proxy<      bool>{ data + x*23 }; }
    };
    
    int main()
    {
        Map m;
    
        m[4][2] = true;
    }
    

    Edit: Verflucht seist du, Braunschwein!



  • @Sone: Warum ist das proxy-Objekt privat?


  • Mod

    typedef std::array<23, std::array<79, bool>> map;
    


  • SeppJ schrieb:

    typedef std::array<23, std::array<79, bool>> map;
    

    :p Andersum. Erst Typ, dann Size.


Anmelden zum Antworten