Zugriff auf andere Objekte derselben Klasse



  • Hallo,

    ich versuche gerade "Mensch ärgere dich nicht zu programmieren" und habe noch einige Probleme, da dies mein erstes Programm dieser Größe ist.

    Es gibt mehrere Objekte der Klasse Spieler und ich möchte jetzt mit einem Spieler einen anderen aufrufen. (dies ist nötig, um ihm mitzuteilen, dass seine Figur geschlagen wurde)

    hier ein Auszug aus der Klasse Spieler:

    class Spieler
    {
    protected:
    	int farbe;                         
    	Figur fig[4];					   								
    public:
    	Spieler();                  
    	~Spieler(void);
    	class Spieler *pt;
         void figurGeschlagen(int pos);
    };
    

    Es gibt außerdem eine Klasse Spiel, hier die wichtigsten member:

    class Spiel
    {
    	int anzSpieler;
    public:
    	Spiel(void);
    	~Spiel(void);
    	class Spieler *sp[4];            
    };
    

    Ich habe versucht die Adresse des Pointer Arrays an jeden Spieler zu geben bei der Initialisierung, und bei durchlaufen des Arrays auf die Spieler zugreifen zu können:

    sp[j]->pt = sp[j];
    

    in einer Methode von "Spiel.cpp" und

    pt++;
    pt->figurGeschlagen();
    

    in einer Methode von "Spieler.cpp"

    Könnt ihr mir sagen, ob es einen einfacheren Weg gibt oder wo bei meinem Weg der Fehler liegt?



  • Ich hab das Gefühl, dass du die Zeiger nicht richtig initialisierst, aber um das genau zu beurteilen, müsste man mehr vom Code kennen. Wieso du überhaupt ein Array von Zeigern verwendest, ist mir auch schleierhaft.

    Wie auch immer, es gibt einen einfacheren Weg. Nimm den STL-Container std::vector , der übernimmt die ganze Speicherverwaltung und lässt sich auch bequem zur Laufzeit vergrössern oder verkleinern. In guten Büchern sollte er beschrieben sein, sonst such mal im Internet danach, du findest bestimmt einige Tutorials.

    class Spieler *sp[4];
    

    Übrigens muss man in C++ kein class bei einer Variablendeklaration schreiben. Oben kann man es also weglassen.



  • Ich dachte, ich nehm am Besten einen array, weil die einzelnen Zeiger dann in aufeinanderfolgenden Adressen gespeichert werden.

    Es ist einfacher, wenn ich einen Zeiger nehme und die 4 Objekte nach erhöhung der Adresse alle nacheinander bei diesem Zeiger abspeicher oder?

    Und wegen der Initialisierung, ich habe das nicht mit "new" gemacht, sondern dachte, es ist egal, ob das array zur laufzeit initialisiert wird, oder einfach irgendwo und von anfang an.

    Aber ich glaube genau deswegen funktioniert es nicht und ich habe den Sinn der dynamischen Initialisierung noch nicht ganz verstanden.



  • chubb schrieb:

    Ich dachte, ich nehm am Besten einen array, weil die einzelnen Zeiger dann in aufeinanderfolgenden Adressen gespeichert werden.

    Das ist bei std::vector auch der Fall. Dieser Container ist zu einfachen C-Arrays abwärtskompatibel, bietet aber darüber hinaus noch nette Funktionen und mehr Sicherheit, ausserdem sparst du dir die eigene Speicherverwaltung.

    chubb schrieb:

    Aber ich glaube genau deswegen funktioniert es nicht und ich habe den Sinn der dynamischen Initialisierung noch nicht ganz verstanden.

    Nun, kurz gesagt braucht man häufig dynamische Arrays (oder eben Container), wenn sich etwas zur Laufzeit verändern soll oder die Grösse erst da bestimmt ist.

    In C++ kann man automatische Variablen (z.B. Arrays) auf dem Stack reservieren, dann wird Speicherplatz angefordert und beim Ende des Scopes wieder freigegeben.

    int StaticArray[4];
    

    Der Nachteil dieser statischen Speicherverwaltung besteht wie gesagt in der fehlenden Flexibilität. Deshalb kann man dynamisch Heap-Variablen anlegen:

    int* DynamicArray = new int[4];
    delete[] DynamicArray;
    

    Wie du siehst, ist ein delete[] erforderlich, um den Speicher wieder freizugeben. Unter anderem deswegen würde ich dir unbedingt raten, dich mal etwas mit der STL auseinander zu setzen, hier gibts einen sehr guten Artikel zu diesem Thema.


Anmelden zum Antworten