static vector: Elemente weg



  • Hallo @all!

    Folgende drei Dateien:

    // main.cc
    // g++ --version: g++ (Debian 4.7.2-5) 4.7.2
    
    #include <iostream>
    #include "UseClass.h"
    
    using namespace std;
    
    static Use_c Use[10];
    
    int main(void){
    
        cout << "Number of Elements: " << Use_c::getNumElement() << endl;
        cout << "Id: " << Use_c::getId() << endl;
    
        return 0;
    }
    
    // UseClass.h
    #include <vector>
    #include <inttypes.h>
    #include <iostream>
    
    #ifndef USE_H
    #define USE_H
    
    class Use_c{
    
        public:
        static std::vector<Use_c *> vecUse;
        static unsigned getNumElement(void);
        static uint32_t getId(void);
        static uint32_t Id;
    
        Use_c(void);
    };
    
    #endif
    

    und

    // UseClass.cc
    #include "UseClass.h"
    
    uint32_t Use_c::Id;
    std::vector<Use_c *> Use_c::vecUse;
    
    Use_c::Use_c(void) { 
    
      Id++;
      vecUse.push_back(this); 
      std::cout << "Use_c(): "  << "vecUseAddr = " << (void *)&vecUse << std::endl;
    }
    
    uint32_t Use_c::getId(void){ return Id; }
    
    unsigned Use_c::getNumElement(void){ 
    
      std::cout << "getNumElement(): " << " vecUseAddr = " <<  (void *)&vecUse << std::endl;
    
      return vecUse.size();
    }
    

    Ausgabe liefert:
    Use_c(): vecUseAddr = 0x804b760
    Use_c(): vecUseAddr = 0x804b760
    Use_c(): vecUseAddr = 0x804b760
    Use_c(): vecUseAddr = 0x804b760
    Use_c(): vecUseAddr = 0x804b760
    Use_c(): vecUseAddr = 0x804b760
    Use_c(): vecUseAddr = 0x804b760
    Use_c(): vecUseAddr = 0x804b760
    Use_c(): vecUseAddr = 0x804b760
    getNumElement(): vecUseAddr = 0x804b760
    Number of Elements: 0
    Id: 10

    Ich verstehe die Ausgabe nicht. Erwartet hätte ich jetzt
    Number of Elements: 10.

    Wo liege ich falsch?

    Besten Dank im Voraus,
    Alex



  • Die Initialisierungsreihenfolge statischer Variablen in verschiedenen übersetzungseinheiten ist nicht definiert. Du benutzt vecUse im Konstruktor schon, bevor er initialisiert wurde.



  • Besten Dank manni!
    War mir sofort klar als ich das von dir gelesen habe.
    Probeweise habe ich mal dir Übersetzungreihenfolge umgestellt also UseClass.cc vor main.cc übersetzt und siehe da:
    Number of Elements: 10
    Natürlich reiner Zufall ;).

    // main.cc
    // g++ --version: g++ (Debian 4.7.2-5) 4.7.2
    
    #include <iostream>
    #include "UseClass.h"
    
    using namespace std;
    
    int main(void){
    
     static Use_c Use[10];
    
        cout << "Number of Elements: " << Use_c::getNumElement() << endl;
        cout << "Id: " << Use_c::getId() << endl;
    
        return 0;
    }
    

    sieht da schon besser aus.



  • AlexRakete schrieb:

    sieht da schon besser aus.

    Die als static deklarierte Variable befindet sich auch in einer Funktion und wird beim ersten Aufruf initialisiert. Hier hast du mehr Kontrolle als bei globalen Variablen und statischen Membervariablen.



  • Das static da in der main -Funktion ist überflüssig. Schau mal in Dein C++ Buch Deiner Wahl, was static in diversen Kontexten macht.



  • krümelkacker schrieb:

    Das static da in der main -Funktion ist überflüssig. Schau mal in Dein C++ Buch Deiner Wahl, was static in diversen Kontexten macht.

    Mir ist sehr klar was static macht. Damit zeige ich an worauf es bei dieser Variable, Objekt ankommt. main () ist nur ein Spezialfall der ohne static funktioniert.
    Kopiere mal das ohne static in eine Funktion die von main aufgerufen wird, dann stürzt das nur ab wenn man Glück hat ⚠ .



  • AlexRakete schrieb:

    krümelkacker schrieb:

    Das static da in der main -Funktion ist überflüssig. Schau mal in Dein C++ Buch Deiner Wahl, was static in diversen Kontexten macht.

    Mir ist sehr klar was static macht. Damit zeige ich an worauf es bei dieser Variable, Objekt ankommt. main () ist nur ein Spezialfall der ohne static funktioniert.
    Kopiere mal das ohne static in eine Funktion die von main aufgerufen wird, dann stürzt das nur ab wenn man Glück hat ⚠ .

    Wieso sollte das abstürzen?


Anmelden zum Antworten