Instanz wird erzeugt, ohne dass der Konstruktor aufgerufen wird


  • Mod

    was passiert, wenn ein CAsteroid kopiert wird, also z.B.:

    CAsteroid asteroid1(&DrawArea);
    CAsteroid asteroid2(asteroid1);
    


  • habs gerade versucht, hat aber keinen unterschied gemacht. ich habe noch ein paar dinge geändert und anscheinend wurde nicht richtig erkannt, wann ein asteroid tot ist. er verschwand zwar richtig aus der console, jedoch schien seine instanz weiterzuleben. der zähler zählt jetzt also runter und ich bekomme einen negativen zählwert.
    das ist jetzt wirklich seltsam, da der konstruktor ja zwangsläufig beim entstehen eines asteroiden aufgerufen werden muss.



  • also das peoblem kann jetzt nurnoch bei
    m_instanceCntr++;
    liegen. der konstruktor muss nämlich zwangsweise funktionieren, da sonst ein asteroid nicht einen zufälligen spawnpunkt hätte.


  • Mod

    CAsteroid hat zwei Konstruktoren, nur einer davon ändert Wert von m_instanceCntr (und ob du nun m_instanceCntr oder CAsteroid::m_instanceCntr oder this->m_instanceCntr etc. schreibst, ist völlig irrelevant).



  • ich habe jetzt auf genau die selbe weise einen statischen zähler für CSprite instanzen gemacht, da CSprite ja die basisklasse eines asteroiden ist. und hier wird tatsächlich auch hochgezählt.
    der konstruktor von CAsteroid muss aber wie schon gesagt aufgerufen werden, denn sonst würden die asteroiden nicht angezeigt werden, da der instanz der pointer auf die klasse zum rendern fehlen würde...
    ich habe auch das hochzählen für die asteroidenklasse an jede nur erdenkliche stelle hingepackt. einmal sogar in eine funktion, die vom konstruktor aufgerufen wird. alles schient zu funktionieren, bis auf diese eine programmzeile, bei der man doch kaum etwas falsch machen kann.
    wirklich seltsam.



  • Wie erzeugst du denn deine Asteroiden?

    Ist die statische Varibale initialisiert?

    /edit/
    erste Frage nehme ich zurück. Hab es gerade entdeckt 🙂



  • das steht in der asteroid.cpp

    int CAsteroid::sm_instanceCntr = 0;
    

    scheint ja auch zu funktionieren. der zähler steht wie gewollt zu beginn auf 0.



  • Hm, verzwicktes Problemchen. 🙂

    Was passiert wenn du die Syntax leicht abänderst, also statt

    CAsteroid tempAsteroid(&render);
    
    CAsteroid tempAsteroid = CAsteroid(&render);
    

    verwendest?

    Nur als Test, ob zumindest die rote Kennzeichnung als Funktion verschwindet... *grübel*



  • leider keine besserung. die rote markierung ist übrigends doch so richtig. ich hab es nochmal an einem einfachen beispiel getestet. wenn sich jemand wundert, warum manche namen sich im code ändern, dann liegt das daran, dass ich einiges zur bessren übersicht geändert habe. an der schreibweise kann das problem aber kaum liegen, sonst würde ja der compiler etwas anzeigen.

    ich glaube ich werds wohl so hinnehmen müssen. solange der rest in den funktionen wie erwartet funktioniert ist das spiel ja funktionsfähig.

    danke für euer bemühen 🙂



  • Ah, jetzt ...

    Du erzeugst ja ein Objekt, dass nicht lange erhalten bleibt. Das Schieben in den Container wird ja mit dem Copy-Konstruktor erledigt. D.h. das Objekt wird gleich wieder gelöscht. Könnte es daran liegen?

    Wenn ja, hätte camper das Problem eigentlich schon erwähnt. 🙂

    /edit/
    Der negative Zähler lässt sich dadurch erklären, dass der Destruktor die Objekte im Container runterzählt, die der Copy-Konstruktor nicht hochgezählt hat.

    Wenn es das auch nicht ist, gebe ich auch auf. 😕 😃



  • hmmm. erscheint mir nicht schlüssig. der zähler ist ja statisch und bleibt somit erhalten selbst wenn die instanz zerstört wird.
    außerdem dürfte dann auch nicht das herunterzählen funktionieren.



  • Puh! Zu schnell für mich.

    Folgendes könnte passieren:

    Der Konstruktor zählt hoch.
    Das Objekt kommt in den Container mit dem Copy-Konstruktor.
    Der Destruktor zählt runter, weil das Objekt ja nur lokal gültig ist und beim Verlassen der Methode zerstört wird, d.h. die Variable m_instanceCntr bleibt unverändert.

    Wird das Objekt im Container zerstört zählt der Destruktor nochmal runter.

    /edit/
    Am Quellcode verdeutlicht:

    void CGame::spawnAsteroids(void)
    {
            // drawarea ist eine instanz einer klasse, die für das rendern
            // verantwortlich ist
            // hier ist m_instanceCntr noch 0
        CAsteroid tempAsteroid(&DrawArea); 
            // nun ist m_instanceCntr 1
        m_lAsteorid.push_back(tempAsteroid);
            // für das Objekt im Container bleibt m_instanceCntr unverändert, 
            // da der Copy-Konstruktor wahrscheinlich m_instanceCntr nicht ändert
    
           // m_instanceCntr wir wieder auf 0 gesetzt, 
           // da tempAsteroid hier zerstört wird
           // und es somit zum Aufruf des Destruktors kommt
    }
    

    Irgendwann später im Quellcode wird auch das Objekt im Container m_lAsteorid zerstört, was zum Destruktoraufruf führt und dazu, dass m_instanceCntr runtergezählt und somti negativ wird.



  • OMG sowas steppt man im Debugger durch wenn man es wissen will, und wenn man aus welchem Grund auch immer keinen Debugger verwenden kann (DirectDraw Fullscreen oder was auch immer), dann verwendet man Debug Traces oder Logfiles (umständlicher, führt aber sicher schneller zu einem Ergebnis als hier Tagelang rumzudiskutieren).



  • hustbaer schrieb:

    OMG ...

    Na, das ist doch kein Grund das höchste "Metaobjekt" anzurufen. 😃

    Du hast natürlich Recht, der Debugger wäre die schnellste Methode gewesen. Wenn ich das richtig sehe, hat camper die Lösung auch schon nach ca. 3 Stunden ins Forum gestellt. Leider zeigte sich der "Patient" uneinsichtig, was bis zur Stunde anhält.

    t512 schrieb:

    hmmm. erscheint mir nicht schlüssig. ...



  • Iich würd sagen du haust mal nen Copy- ctor in dein code, welcher auch den instanzenzähler hochzählt.. bei der kopie in den containert bleibt der wert unverändert... wie schon erwähnt wurde...

    1. Erezugen (Zähler++)
    2. Kopie in den Container (passiert nicht mit zähler)
    3. zestörung nach kopie (Zähler--)

    -- objekt lebt

    4. obekt wird ausm container gelöscht (Zähler--)



  • ok, das erscheint mir jetzt schlüssig. ich habe wohl nicht gleich verstanden, was camper da gemeint hat.



  • jo, bau nen copy-ctor ein, und es funzt;) 😃


Anmelden zum Antworten