static Member außerhalb der Klasse definieren geht mir auf die Nerven



  • Warum muss ich eigentlich immer bei

    class MyClass
    {
        static const double bla;
    };
    

    die Variable bla nochmal außerhalb der Klasse definieren, wen es nicht gerade ein const int ist?
    Das geht mir echt auf die Eier. Hat das einen tieferen Sinn?



  • Mal angenommen, es wäre erlaubt:

    //X.h
    class X {
      static const double d;
    };
    
    //a.cpp
    #include "X.h"
    //...
    
    //b.cpp
    #include "X.h"
    //...
    

    Welche Übersetzungseinheit stellt dann den Speicher bereit?



  • Warum muss ich const-Members in der Konstruktorinitialisierungsliste initialisieren? Das geht mir echt auf die Nerven 🙄 .



  • Welche Übersetzungseinheit stellt dann den Speicher bereit?

    Wieso, ne statische Variable ist auch nichts anderes wie ein globale. Und die muss ich auch nur einmal definieren.

    @MaSTaH: ich will ein Kind von dir 🙄



  • Optimizer schrieb:

    Wieso, ne statische Variable ist auch nichts anderes wie ein globale. Und die muss ich auch nur einmal definieren.

    😕 Also ich sehe schon Unterschiede zwischen statischen und globalen. Wenn ein Modul A eine globale Variable verwendet sind automatisch alle anderen Module die darauf zugreifen abhängig. Verändert man nun etwas an Modul A so sind alle anderen Module eventuell davon betroffen. Einen static-Member kannst du private machen und Zugriffsfunktionen bereitstellen. Dadurch garantierst du bei internen Änderungen in A, dass die anderen Module das richtige bekommen. Auch dieses "Information-Hiding" gehört zur objektorientierten Programmierung.

    Software entities (Classes, Modules, Functions etc.) should be open for extension, but closed for modification.

    Optimizer schrieb:

    @MaSTaH: ich will ein Kind von dir 🙄

    Das wollen einige 😃 .



  • trotzdem sehe ich keinen Sinn darin, alle statischen Variablen zweimal "bekanntzumachen". Und was ich noch komischer finde, dass es bei const int ja doch geht, die Definition direkt in die Klasse zu schreiben. 😡 😉



  • Ja, weil konstante Integer beim kompilieren wegoptimiert werden. Bei statischen Variablen muss eine Übersetzungseinheit aber den Speicher bereitstellen, auch bei Integern. Ich denke mal deswegen geht es nicht (korrigiert mich wenn ich falsch liege).



  • Optimizer schrieb:

    Welche Übersetzungseinheit stellt dann den Speicher bereit?

    Wieso, ne statische Variable ist auch nichts anderes wie ein globale. Und die muss ich auch nur einmal definieren.

    aber wenn du sie woanders benutzen willst?
    probier mal

    //header.h
    int x = 10;
    
    //a.cpp
    #include "header.h"
    //...
    
    //b.cpp
    #include "header.h"
    //...
    

    so und jetzt?
    du darfst die globale variable, genauso wie die statische nur einmal definieren.
    deklarieren geht sooft du willst. und in der klasse selsbt ist eine statische membervariable nur deklariert.



  • Optimizer schrieb:

    Und was ich noch komischer finde, dass es bei const int ja doch geht, die Definition direkt in die Klasse zu schreiben. 😡 😉

    Das mit const wurde deshalb eingefuehrt:

    class X
    {
      static const int size = 10;
      int feld[size];
    };
    

    Und dass es nicht bei nicht-const-Variablen funktioniert wuerde ich mal als daemliches ueberbleibsel aus alten Zeiten bezeichnen.



  • die Variable bla nochmal außerhalb der Klasse definieren, wen es nicht gerade ein const int ist?
    Das geht mir echt auf die Eier. Hat das einen tieferen Sinn?

    Sicher. Den Sinn findest du in der Erklärung von Integralen Konstanten und deren Sonderstellung.
    Da ein double nun mal keine Integrale Konstante ist, benötigst du eine Definition.

    Wieso, ne statische Variable ist auch nichts anderes wie ein globale. Und die muss ich auch nur einmal definieren.

    Richtig. Und genausowenig wie du eine globale Variable in einem Header definierst, defenierst du auch eine statische Membervariable nicht im Header.
    Das:

    class Bla
    {
    public:
    static int blub;
    };
    

    ist vergleichbar mit:

    extern int blub;
    

    Beides ist eine Deklaration und bedarf *genau eine* Definition in einer cpp-Datei.

    Und was ich noch komischer finde, dass es bei const int ja doch geht, die Definition direkt in die Klasse zu schreiben.

    Damit *deklarierst* du die Konstante nur. Sobald du z.B. die Adresse der Konstante bilden willst, benötigst du eine Definition. Und die wiederum gehört in eine cpp-Datei.
    Die Deklaration in der Klasse reicht nur, wenn du die Konstante tatsächlich nur als Integrale Compilezeit-Konstante verwendest.

    Und dass es nicht bei nicht-const-Variablen funktioniert wuerde ich mal als daemliches ueberbleibsel aus alten Zeiten bezeichnen

    Ich würde das eher als logische Konsequenz der one-definition-rule im Zusammenhang mit dem seperaten Übersetzungsmodell von C++ bezeichnen. Ob das nun ein "daemliches ueberbleibsel" ist, vermag ich nicht zu beurteilen.



  • ja, klingt schon logisch. Trotzdem nervig 😉



  • Genau 😉
    In Java gehts ja schließlich auch -.-

    Der nächste C++ Standard wird's schon richten 🙄


Anmelden zum Antworten