von Objekt auf Objekt zugreifen



  • 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 schreiben
    

    Nicht vergessen, am Schluss wieder mit delete zu 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 new nicht 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 new muss 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 new nicht 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 jedes new eines)? :p


Anmelden zum Antworten