1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Visual C++ 6.0

    • Frage
  • thurin
  • 10. Dezember 2003 um 21:19
  • Unerledigt
  • thurin
    6
    thurin
    Mitglied
    Punkte
    325
    Beiträge
    56
    • 10. Dezember 2003 um 21:19
    • #1

    grias ench!

    folgende frage an alle c++ gurus.. ich glaub aber, dass es eher was mitm visual studio zu tun hat..

    eine einfache klasse, die sich selbst verwalten soll:

    C
    #ifndef ___OBJECT_H___
    #define ___OBJECT_H___
    #define AUTO_SIZE UINT size( void ) { return( sizeof( *this ) ); }
    #define AUTO_NAME( name ) std::string toString( void ) { return std::string( name ); }
    #include <list>
    class Object
    {
    private:
    static std::list< Object* > liveObjects;
    static std::list< Object* > deadObjects;
    UINT uiRefCount;
    protected:
    Object( void );
    virtual ~Object( void );
    public:
    ARESULT AddRef( void );
    ARESULT Release( void );
    static ARESULT CollectGarbage( void );
    static ARESULT CollectRemainingObjects( bool bEmitWarnings = true );
    virtual UINT size( void ) = 0;
    virtual std::string toString( void ) = 0;
    };
    #endif
    Alles anzeigen



    die quelldatei dazu kompiliert ohne probleme.. aber wenn ich zum linken komm, bekomm ich folgende fehlermeldung:

    Code
    Linker-Vorgang läuft...
    Object.obj : error LNK2001: Nichtaufgeloestes externes Symbol "private: static class std::list<class Object *,class std::allocator<class Object *> > Object::liveObjects" (?liveObjects@Object@@0V?$list@PAVObject@@V?$allocator@PAVObject@@@std@@@std@@A
    )
    Object.obj : error LNK2001: Nichtaufgeloestes externes Symbol "private: static class std::list<class Object *,class std::allocator<class Object *> > Object::deadObjects" (?deadObjects@Object@@0V?$list@PAVObject@@V?$allocator@PAVObject@@@std@@@std@@A
    )
    Debug/engine.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.



    und ich hab keine ahnung warum.. kann es sein, dass ich irgendwelche linker-optionen ändern muss, wenn ich die stl verwenden will?

    ich würd mich über hilfreiche tips freuen!

    F

    PS: ich lad grad service pack 5 runter.. vielleicht gehts ja dann..

    nur ein mac ist ein mac ist ein mac ist ein....

  • Irrlicht
    7
    Irrlicht
    Mitglied
    Reaktionen
    1
    Punkte
    421
    Beiträge
    82
    • 11. Dezember 2003 um 09:44
    • #2

    Das hat eigentlich nix mitm Visual Studio zu tun, sondern eher mit C++. Würd mich wundern wenn das mit nem anderem Compiler kompilieren würde. Aber vielleicht würde ein anderer zumindest irgendwo ne Warning ausgeben. Das Problem: Statische Membervariablen, wie bei dir liveObjects und deadObjects müssen irgendwo initialisiert werden. Am besten machst du das in irgendeiner .Cpp datei, ausserhalb einer Funktion oder Methode.

    das irrlicht

  • thurin
    6
    thurin
    Mitglied
    Punkte
    325
    Beiträge
    56
    • 11. Dezember 2003 um 10:01
    • #3

    danke für die antwort!

    eine quellcodedatei hab ich dazu natürlich auch:

    Code
    #include "Object.h"
    Object::Object( void )
    {
     liveObjects.push_back( this );
     uiRefCount = 0;
    }
    Object::~Object( void )
    {
    }
    ARESULT Object::AddRef( void )
    {
     uiRefCount++;
     return A_OK;
    }
    ARESULT Object::Release( void )
    {
     uiRefCount--;
     if( uiRefCount <= 0 )
     {
      liveObjects.remove(this);
      deadObjects.push_back( this );
     }
     return A_OK;
    }
    ARESULT Object::CollectGarbage( void )
    {
     for( std::list< Object* >::iterator it = deadObjects.begin();
    		it != deadObjects.end(); it++ )
     {
      delete( *it );
     }
     deadObjects.clear();
     return A_OK;
    }
    ARESULT Object::CollectRemainingObjects( bool bEmittWarnings )
    {
     for( std::list< Object* >::iterator it = liveObjects.begin();
    		it != liveObjects.end(); it++ )
     
     {
      Object *o = *it;
      if( bEmittWarnings )
      {
       // error output
      }
      delete o;
     }
     liveObjects.clear();
     return A_OK;
    }
    Alles anzeigen



    Zitat von Irrlicht


    Das Problem: Statische Membervariablen, wie bei dir liveObjects und deadObjects müssen irgendwo initialisiert werden. Am besten machst du das in irgendeiner .Cpp datei, ausserhalb einer Funktion oder Methode.


    ich nehm an, du meinst sowas wie

    Code
    Object::liveObjects = 0;


    wenns a zahl wär..

    wie funktioniert das bei stl?

    F

    nur ein mac ist ein mac ist ein mac ist ein....

  • Irrlicht
    7
    Irrlicht
    Mitglied
    Reaktionen
    1
    Punkte
    421
    Beiträge
    82
    • 11. Dezember 2003 um 10:16
    • #4
    Zitat von thurin


    wie funktioniert das bei stl?

    Hat auch nichts mit der STL zu tun, bei irgendwelchen anderen statischen Klassen ist es genauso.

    Ein einfaches

    Code
    std::list< Object* > Object::liveObjects;
    std::list< Object* > Object::deadObjects;


    sollte reichen. Was programmierst du denn da schönes? :)

    das irrlicht

  • thurin
    6
    thurin
    Mitglied
    Punkte
    325
    Beiträge
    56
    • 11. Dezember 2003 um 10:21
    • #5
    Zitat von Irrlicht

    Hat auch nichts mit der STL zu tun, bei irgendwelchen anderen statischen Klassen ist es genauso.

    Ein einfaches

    Code
    std::list< Object* > Object::liveObjects;
    std::list< Object* > Object::deadObjects;


    sollte reichen. Was programmierst du denn da schönes? :)

    dann beiß ich ma aber in oasch :winking_face:

    in so ca. 3 jahren hab ich dann meine eigene 3d engine :winking_face:

    die idee für die objects hab ich von einem artikel aus dem internet und die idee scheint mir übernehmenswert.. wenn man jetzt die weiteren klassen von object ableitet, läuft mann nicht in gefahr irgendwo memory leaks zu erzeugen.. und bei meinem schlampigen programmierstil, würd sich das wahrscheinlich nicht vermeiden lassen :winking_face:

    habs schon ausprobiert und es funktioniert! vielen dank.. war ein echt dummer fehler..

    F

    nur ein mac ist ein mac ist ein mac ist ein....

  • Irrlicht
    7
    Irrlicht
    Mitglied
    Reaktionen
    1
    Punkte
    421
    Beiträge
    82
    • 11. Dezember 2003 um 10:31
    • #6
    Zitat von thurin


    in so ca. 3 jahren hab ich dann meine eigene 3d engine :winking_face:

    hehe :)

    Zitat von thurin


    wenn man jetzt die weiteren klassen von object ableitet, läuft mann nicht in gefahr irgendwo memory leaks zu erzeugen.. und bei meinem schlampigen programmierstil, würd sich das wahrscheinlich nicht vermeiden lassen :winking_face:

    Stimmt.. Nur bei zyklischen Referenzen solltest du dann vermutlich doch aufpassen, die kommen nämlich nie in deadObjects rein, und werden dann erst bei CollectRemainingObjects() gelöscht. Also nicht wundern wenn du dann dein Programm irgendwann massenweise Speicher braucht, der erst am Schluss freigegeben wird. :)

    das irrlicht

  • thurin
    6
    thurin
    Mitglied
    Punkte
    325
    Beiträge
    56
    • 11. Dezember 2003 um 10:42
    • #7
    Zitat von Irrlicht

    Also nicht wundern wenn du dann dein Programm irgendwann massenweise Speicher braucht, der erst am Schluss freigegeben wird. :)


    hauptsache, er wird wieder freigegeben :winking_face:

    vielen dank für die hilfe!

    F

    nur ein mac ist ein mac ist ein mac ist ein....

  • Maximilian Rupp 27. Dezember 2024 um 12:08

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung