Globale Variable



  • daddy_felix schrieb:

    nein, mit Arrays geht das so nicht. Es geht, aber anders. (Präventiv:) Du solltest statt Arrays sowieso lieber std::vector nehmen.

    Generell kommst du gerade irgendwie vom Hundersten ins Tausendste. Es gibt häufig mehrere Möglichkeiten der Modellierung. Je nach konkretem Problem sind einige besser, andere schlechter. Allgemein lässt sich sowas selten sagen.

    jo ich merke schon das ich grad bisschen überfordert werde mit dem Schritt, aber irgendwie will ich einfach eine schöne lösung für mein Problem finden aber find sie einfach nicht..

    Globale Variablen will ich nicht..
    Arrays hab ich keine Ahnung..



  • Was ist denn dein Problem? Werde doch mal ein bisschen konkreter...

    std::vector kannst du wie einen einfachen Datentyp als Parameter über- bzw. zurückgeben.

    std::vector machWas(int x)
    {
      std::vector myVector;
      myVector.push_back(x);
    
      MachNochMehr(myVector);
    
      return myVector;
    }
    
    void MachNochMehr(std::vector& vec)
    {
      vec.push_back(5);
      vec.push_back(vec.size());
    }
    

    }



  • Eine gute Lösung? Dann Post mal dein konkretes Problem dann können wir dir sicher eine gute Lösung anbieten.

    gruß
    syntax


  • Mod

    Flutschii schrieb:

    Vielen Dank, mit der return würde es so wie ich das Projekt habe funktionieren, aber ich denke das ich das eben immer weiter entwickle und dann plötzlich 2 Variablen habe, darum frage ich jetzt schon was währe wenn 😉

    In der Regel sind Werte, die aus der selben Funktion stammen, nicht unabhängig voneinander, sondern Teil der gleichen Abstraktion. Es ist also zu erwarten, dass sie von vornherein durch eine entsprechende Klasse oder ggf. einen Container abgebildet werden können. Aus vielen Werten wird dann automatisch wieder nur einer.
    In den eher seltenen Fällen (primär bestimmte Arten von generischem Code), wo tatsächlich nur Mengen von Werten ohne inneren Zusammenhang entstehen, gibt es Möglichkeiten, diese temporär in Tupeln zusammenzufassen (std::tie).



  • 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).


Anmelden zum Antworten