Instanz wird erzeugt, ohne dass der Konstruktor aufgerufen wird



  • 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