Globale Variable



  • Also es ist so:

    Ich habe ein ganz einfaches Spielchen hier, wobei ich eine Map in einer Datei habe und diese aus 1en und 0en besteht, und ich diese Datei nun in die Variable dieMap[100][100] lade in der Funktion LoadMap. Nun brauch ich aber diese Variable auch wenn ich mit dem Spieler rumlaufe, da ich ja kollision abfragen muss, und darum muss ich von der Funktion MovePlayer, wo aber in der Datei Player.cpp ist, auf die Variable dieMap, die in Map.cpp drin ist, zugreifen können..

    Klar könnte ich das jetzt mit return machen, aber ich denke das später nochmals eine funktion kommmt die dann diese Variable will und dann steh ich wieder vor demselben Problem...

    ich möchte ungern dieMap global definieren, aber wie mache ich das gewisse Funktionen aus anderen Dateien zugriff auf diese erlangen ohne global?



  • Wie wärs mit ner Singleton-Klasse?

    könnte so aussehen:

    // CMap.h
    class CMap
    {
    
    private:
    
        CMap(); // Wichtig: Konstruktor ist private!
    
    public:
    
        int arr[100][100]; // Die Map
    
        // Beispielfunktionen:
        void LoadMap(); // Laden einer Map
    
        static CMap& Instance()
        {
            static CMap m;
            return m;
        }
    
    };
    // Implementierung von LoadMap in CMap.cpp
    
    // Zugriff dann so:
    
    CMap::Instance().LoadMap();
    CMap::Instance().arr[0][0] = 1;
    
    // oder so:
    
    CMap& myMap = CMap::Instance(); //Referenz!
    myMap.LoadMap();
    int i = myMap.arr[1][2];
    

    So kannst du dann in allen Funktionen auf die gleiche Map zugreifen, die du einmal geladen hast, da es von der Klasse CMap nur eine Instanz gibt ,die die Klasse selber besitzt.

    Also ich find das schön...


  • Mod

    Jochen S. schrieb:

    CMap(); // Wichtig: Konstruktor ist private!
    

    Das sollte allerdings der Copy-ctor sein... 😉



  • camper schrieb:

    Jochen S. schrieb:

    CMap(); // Wichtig: Konstruktor ist private!
    

    Das sollte allerdings der Copy-ctor sein... 😉

    Jaja, hast ja recht. Den Zuweisungsoperator müsste man auch noch private machen, den Destruktor eigentlich auch 😉



  • Oha, bin grad nich zuhause aber werd mir das dann mal anschauen, vielen dank auf jedenfall schonmal!



  • Jetzt krieg ich einen Fehler...

    error LNK2001: Nicht aufgelöstes externes Symbol ""private: __thiscall SMap::SMap(void)" (??0SMap@@AAE@XZ)".
    

    bei

    SMap::Instance().LoadMap("map.txt");
    


  • Tausche gerne ein ' S ' gegen ein ' C '.



  • Spielt das ein Rolle ob ich da ein S oder ein C hab? ich hab überall S gegen C getauscht....



  • Ne, hab nur geglaubt, du hättest Jochen S.'s Beispiel übernommen ( CMap ).
    Spendier dem Konstruktor eine Definition.



  • I did...

    Singleton.hpp

    class SMap
    
    {
    private:
    	SMap();
    
    public:
    
    	int mapFile[100][100];
    
    	void LoadMap(const char *filename);
    
    	static SMap &Instance()
    	{
    		static SMap m;
    		return m;
    	}
    
    };
    

    Singleton.cpp

    #include "stdafx.h"
    #include "SingletonMap.hpp"
    #include <fstream>
    
    void SMap::LoadMap(const char *filename)
    {
    	int mapSizeX, mapSizeY, loadX, loadY;
    	std::ifstream openfile(filename);
    	if(openfile.is_open())
    	{
    		openfile >> mapSizeX >> mapSizeY;
    			while(!openfile.eof())
    			{
    				openfile >> mapFile[loadX][loadY];
    				loadX++;
    				if(loadX >= mapSizeX)
    				{
    					loadX = 0;
    					loadY++;
    				}
    			}
    	}	
    }
    
    int mapFile[100][100];
    

    Map.cpp

    void Map::DrawMap(sf::RenderWindow *mainWindow)
    
    {
    
    	SMap::Instance().LoadMap("map.txt"); //
    
    }
    


  • Flutscherino schrieb:

    Singleton.hpp

    class SMap
    {
    private:
    	SMap(); // hat keine Definition -> "unresolved external Symbol"
    
    public:
    	int mapFile[100][100]; // warum public?
    /* ... */
    };
    

    Singleton.cpp

    void SMap::LoadMap(const char *filename)
    {
    	int mapSizeX, mapSizeY, loadX, loadY; // loadX und loadY bleiben bis zur Verwendung uninitialisiert!?
    /* ... */
    }
    
    int mapFile[100][100]; // <-- wofür?
    

    Map.cpp

    void Map::DrawMap(sf::RenderWindow *mainWindow) // <- Noch eine Map-Klasse (deren Deklaration du uns unterschlägst) !?
    {
    /* ... */
    }
    


  • Oh wow vielen Dank, habs rausgefunden an was es lag!

    ich musste einfach n leeren Konstruktor machen ;p

    int mapFile[100][100]; // <-- wofür?
    

    Das frage ich mich auch schon länger, aber immer wenn ich irgendwas nicht aufgelöst hab und am schluss hinschreib klappt es.... warum, das weis ich leider noch nicht 😕



  • weil du in deinem restlichen Code nicht die Klasse benutzt sondern weiterhin deine alte globale Variable

    greetz KN4CK3R



  • Seid ihr sicher, dass es eine gute Idee ist, einem absoluten Anfänger ohne grundlegende Kenntnisse ein Singleton um die Ohren zu hauen?



  • Wen meinst du mit "ihr"?



  • Swordfish schrieb:

    Wen meinst du mit "ihr"?

    Jochen S. (er hat das vorgeschlagen) und dich (du hast Hilfestellung bei der Anwendung geleistet).



  • Aha. ... und weil ich nicht sofort geschrien hab', das Singletons phöse sind, der Phurche es lassen soll, weil's ihm in seinem Lernstadium nix bringt, bin ich natürlich der Mittäterschaft schuldig - verstehe. 💡

    // edit: Orthographie...



  • Swordfish schrieb:

    Aha. ... und weil ich nicht sofort geschrien hab' das Singletons phöse ist, der Phurche es lassen soll weils ihm in seinem Lernstadium nix bringt bin ich natürlich der Mittäterschaft schuldig - verstehe. 💡

    😮

    meine Güte, jetzt dreh doch nicht gleich durch. Ich hab gesehen, dass hier auf einmal Singletons durch die Gegend geschmissen werden und habe angemerkt, dass das evtl. keine gute Idee ist. Sollte wirklich kein persönlicher Angriff sein.



  • Streitet doch nicht um mich 😞



  • Singletons sind super... finde ich zumindest 😉

    @Flutscherino:
    Ach, mich lässt das kalt, ob die anderen über meine Lösung streiten oder nicht 😉
    Wie siehts aus, läuft alles, oder brauchst du noch irgendwo Hilfe?


Anmelden zum Antworten