von Objekt auf Objekt zugreifen
-
Ich habe da mal was ausprobiert, nur mal alles verküürtzt in einer einzigen Datei:
class A : public Root { public: void Go() { }; }; class B : public Root { public: void Stop() { }; }; class Root { public: A* mA; B* mB; };Jetzt ist das Problem ganz deutlich zu erkennen! Damit ich die zeiger setzen kann, müssen erst die Klassen A und B deklariert sein! Darum packe ich sie nach oben. Jetzt fehlt den beiden klassen aber die klasse Root! Wie mache ich das nun, das die beiden Klassen A und B auch die Klasse Root kennen?
EDIT::::::
Ich habs

class A; class B; class Root { public: A* mA; B* mB; }; class A : public Root { public: void Go() { }; }; class B : public Root { public: void Stop() { }; };Ist dies der optimale weg, oder währe ein besserer zu empfehlen?
-
wenn du nur ein zeiger hast, musst du die klasse nicht definieren, nur deklarieren
class A; class B; class Root { public: A* mA; B* mB; }; class A : public Root { public: void Go() { }; }; class B : public Root { public: void Stop() { }; };
-
mist schneller...
das ist der normale weg und nennt sich "Forward Declaration".
da du nur zeiger hast die immer gleich groß sind(4 Byte auf 32bit)
braucht der compiler nur zu wissen, dass die "class A" existiert
-
Funktioniert aber irgentwie nicht wenn ich dann das hier machen will:
class A : public Root { public: void Go() { mB->Stop(); }; };Mint der Debugger, das mB keine classe währe, also das eine klasse/union/struktur erwartet wird, und das B undefiniert ist!
EDIT :::: Hehe! xD
-
Hmm

Kann man das dnn irgent wie anders machen, sondass der selbe zweck erfüllt wird?
-
Wenn du natürlich die Klasse benutzen willst (z.B. indem du auf Methoden zugreifst), muss sie schon vollständig definiert sein. Deshalb würde ich
A::Go()nicht inline in der Klasse selber definieren, sondern ausserhalb in einer eigenen CPP-Datei. In diese Datei inkludierst du dann die Header der benötigten Klassen.
-
Ja bin ich auch grad drauf gekommen

Nur habe ich jetzt nen anderes Problem, also es funktioniert inwandfrei! Aber in meiner maindatei benutze ich jetzt folgendes:
Root* mRoot; A* mA; B* mB; mA->Go();Der debugger spuckt keine fehler aus, ich bekomme bloß einen Runtime fehler, irgentwas stimmt nicht it dem this zeiger

EDIT::::
+ this 0x00000000 WheelEngine::A * const
+ WheelEngine::Root {mA=??? mB=??? } WheelEngine::Root
mA CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden
mB CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden
-
Du hast ja nur die Zeiger deklariert, ohne ihnen Speicher zuzuweisen.
Root* mRoot = new Root(); // in die Klammern könnte man noch Konstruktorargumente schreibenNicht vergessen, am Schluss wieder mit
deletezu löschen!
-
Hab ich gemacht, fehler bleibt aber

-
-
...
-
Okay, diesen Topic st dann geschlossen, thx for help

-
Code-Walker schrieb:
Ich vemute mal mir will niemand mehr helfen?
Hast du einen Komplex? Du kannst nicht erwarten, dass du zwei Minuten nach deiner Frage gleich eine Antwort gestellt bekommst.
Ich kann mir nicht vorstellen, dass das mit
newnicht geht. Wenn, dann ist etwas an der Initialisierung fehlgeschlagen (wahrscheinlich im Konstruktor) oder du zerschreibst dir den Speicher noch nachträglich.Geh mal mit dem Debugger (im Debug-Modus) schrittweise durch, und überprüfe, von wo an kein gültiger Wert mehr besteht, bzw. ob überhaupt einmal eine korrekte Initialisierung stattfindet.
Edit: Dir scheint auf spieleprogrammierer.de inzwischen geholfen worden zu sein. Das
newmuss man natürlich bei allen Zeigern ausführen...Und wie gesagt, vergiss kein
delete, um den Speicher wieder freizugeben, wenn du ihn nicht mehr brauchst.
-
Nexus schrieb:
Code-Walker schrieb:
Ich vemute mal mir will niemand mehr helfen?
Hast du einen Komplex? Du kannst nicht erwarten, dass du zwei Minuten nach deiner Frage gleich eine Antwort gestellt bekommst.
Ich kann mir nicht vorstellen, dass das mit
newnicht geht. Wenn, dann ist etwas an der Initialisierung fehlgeschlagen (wahrscheinlich im Konstruktor) oder du zerschreibst dir den Speicher noch nachträglich.Geh mal mit dem Debugger (im Debug-Modus) schrittweise durch, und überprüfe, von wo an kein gültiger Wert mehr besteht, bzw. ob überhaupt einmal eine korrekte Initialisierung stattfindet.
Schau mal meinem Post auf sp.de an. Dort habe ich den Fehler gepostet.
-
drakon schrieb:
Schau mal meinem Post auf sp.de an. Dort habe ich den Fehler gepostet.
Ich habs gesehen

Naja, damit habe ich eigentlich nicht gerechnet... Etwas Mitdenken hätte ich schon erwartet, sodass man den Fehler nicht nur an einer Stelle behebt...

-
hab auf Spieleprogrammierer noch net nachgesehen, aber ich habs auch xD
Root* mRoot = new Root(); A* mA = new A(); B* mB = new B();Außerdem haben Konstruktor und destuktor gefehlt, wobei der Konstruktur für den Run time error verantwortlich war! dankeschön

-
Code-Walker schrieb:
Außerdem haben Konstruktor und destuktor gefehlt, wobei der Konstruktur für den Run time error verantwortlich war! dankeschön

Du brauchst den Konstruktor und Destruktor nicht selber zu implementieren. Wenn du sie weglässt, erzeugt sie der Compiler standardmässig. Der Runtime-Error lag wohl eher am Zugriff auf den nicht initialisierten Zeiger.
P.S.: Hast du jetzt ein
delete(besser gesagt 3, für jedesneweines)? :p