Ein member Objekt für alle Instanzen einer Klasse



  • ich steh grad bischen aufm schlauch

    ich hab bspw.:

    class Data{
    
      static CDatabase *m_pDatabase;
      Data(){
        m_pDatabase = new CDatabase(); <--- nur wenn erste instanz erzeugt wird!!
    .
    .
    .
    
      }
    ~Data(){
    
    delete m_pDatabase ; <-- nur wenn letzt instanz von Data gelöscht wird!!
    
    }
    
    }
    

    wie mach ich das bin grad bischen verwirrt....



  • Wie David schon sagte - Einfach die Konstruktionen und Destruktionen mitzählen:

    class Data{
    
      static CDatabase *m_pDatabase;
      static size_t m_instances;
    
      Data() {
        if (m_instances == 0)
            m_pDatabase = new CDatabase();
        ++m_instances;
      }
    };
    
    size_t Data::m_instances = 0;
    

    Den Destruktor lass ich mal als Fleissübung 😉



  • ok sehr gut danke .. die Zeile :

    size_t Data::m_instances=0;
    

    wird beim compailiervorgang bearbeite , das heist wenn ich irgendwo in meinem code eine isntanz erzeuge muss ich size_t Data::m_instances=0 nicht nochmal aufrufen, damit er bei 0 anfängt zu zählen?



  • EDIT: Zu spät.
    Schon lustig, dass es bei mir auch "instances" heisst ... ist doch recht generisch.

    Ich lass' das trotzdem mal stehen...

    Ist doch scohnmal ein Anfang;
    Du musst Dir nur noch die Information "bin n. Instanz" merken:

    class Data{
    
      static CDatabase *m_pDatabase;
      static size_t instances;
      Data(){
        if(instances++ == 0) {
           m_pDatabase = new CDatabase(); <--- nur wenn erste instanz erzeugt wird!!
        }
    .
    .
    .
    
      }
      ~Data(){
          if(instances == 0) {
             delete m_pDatabase ; 
          }
          else --instances;
       }
    };
    size_t Data::instances = 0;
    

    Gruß,

    Simon2.



  • jepp hab ich verstanden, nur die frage wann ich m_Instanze von der klasse initalisieruen muss? einfach in der Header?

    X::m_Instanz=0; <----
    
    class X{
    
    static size_t m_Instanz;
    
    };
    


  • BorisDieKlinge schrieb:

    ok sehr gut danke .. die Zeile :

    size_t Data::m_instances=0;
    

    wird beim compailiervorgang bearbeite , ...

    Ääääh ja ? nein ?
    Ich glaube, Du meinst was Anderes.
    Diese Zeile sorgt dafür, dass beim Programmstart einmal diese Initialisierung ausgeführt wird.

    BorisDieKlinge schrieb:

    ...einfach in der Header? ...

    NEIN !
    Diese Definition darf es nur einmal geben (One-Definition-Rule; ODR) und das geht in Headern (meistens) schief.
    -> in ein passendes cpp-File.

    Gruß,

    Simon2.



  • ja das weis ich...

    nur ist meien frage ob ich die zeite am Anfang meine Programmstart aufrufen muss, oder wie hier erwähnt einfach in der Header datei?

    Damit meine ich, sobalt das Progamm compiliert wurde, ist diese Vriabel schon auf 0??



  • Du brauchst gar nichts selbst aufzurufen.
    Sobald das Programm gestartet wurde (bzw. rechtzeitig vor der ersten Benutzung) wird diese Variable "mit dem Wert 0 ins Leben gerufen".

    Gruß,

    Simon2.

    P.S.: Du denkst daran, dass statics Probleme mit Multithreading haben, ja ?



  • jepp danke das wollte ich wissen.. ja die klasse wird später nich in threads implementiert:)



  • Was meinst du mit "in threads implementier". Diese andernanderreihung von Worten gibt keinen Sinn.

    Es geht darum die Klasse von mehreren Threads verwendet wird.


Anmelden zum Antworten