static uninitialized Member?



  • Wie kann ich ein Member einer Klasse statisch machen und ihn definiren ohne in initialisiren zu müssen (also default constructor nutzen)?

    class A{
    public:
        static int i;
    };
    int A::i;//Compiler spuck hier redeclaration Error aus
    

    Fals ich i auch initialisire dann geht es, allerdings wo ich es brauch ist es halt eine Klasse die nur einen default Konstruktor hat.

    Bitte helft mir.



  • Der spuckt dir das aus, weil du i ein weiteres mal deklarierst nicht weil i
    nicht definiert wurde.



  • Hallo,
    der Code ist korrekt. Was ist das für ein Compiler?



  • /* erledigt */



  • Der spuckt dir das aus, weil du i ein weiteres mal deklarierst nicht weil i nicht definiert wurde.

    falsch staische Member müssen ausserhalb der Klasse wie Funktionen definirt werden.

    Es ist BC5.5 (Die gratis Version von Borland)



  • Unter einer Definition verstehe ich folgendes i=3; und unter int i; eine deklaration



  • Unter einer Definition verstehe ich folgendes i=3; und unter int i; eine deklaration

    Kommt darauf an wo. Auserhalb einer Klasse ist int i; eine Definition und extern int i; die Declaration. In einer Klasse ist allerdings int i; eine Declaration und definirt muss man ausserhalb der Klasse. (in welcher Datei sollte der Compiler den die Variable hinzufügen wenn du eine Klasse in meheren Dateien verwendest?)



  • SirLant schrieb:

    Unter einer Definition verstehe ich folgendes i=3; und unter int i; eine deklaration

    Tja dann verstehst du die beiden Begriffe leider falsch.
    i = 3 ist eine simple Zuweisung.
    int i; ist eine Definition, die natürlich gleichzeitig auch eine Deklaration ist.



  • Hallo,
    also noch mal langsam. Das wird von deinem Compiler nicht übersetzt?

    class Foo {};
    class A{ 
    public: 
        static Foo i; 
    }; 
    Foo A::i;
    

    Wie sieht es hiermit aus:

    class Foo {};
    class A{ 
    public: 
        static Foo i; 
    }; 
    Foo A::i = Foo();
    


  • Danke das klappt.



  • jemand schrieb:

    Danke das klappt.

    Erfordert aber einen Copy-Ctor.



  • Erfordert aber einen Copy-Ctor.

    Wundersamer Weise nicht. Wahrscheinlich irgendeine Optimirung oder das ist bewusst so weil die andere Definirung nicht geht.
    Jedenfals das:

    #include<iostream>
    using namespace std;
    class B{
    public:
         B(){cout<<"Konstuktor"<<endl;}
         B(B&){cout<<"Copy-Konstuktor"<<endl;}
    };
    class A{
    static B b;
    };
    B A::b=B();
    int main(){
         A a;
         system("pause");
         return 0;
    }
    

    zeigt

    Konstuktor

    und kein Copy-Konstuktor.



  • Der Aufruf selber darf natürlich vom Compiler entfernt werden.
    Aber folgendes dürfte nicht erlaubt sein:

    class B
    {
    public:
        B() {}
    private:
        B(const B&) {}
    };
    class A
    {
        static B b;
    };
    B A::b = B();
    

    Der Aufruf des Copy-Ctors darf zwar "wegoptimiert" werden, er muss aber dennoch möglich sein.

    btw:
    Der Copy-C'tor hat als Parameter ein "const B&", kein "B&". Wir wollen doch const-correct bleiben. 🙂



  • Der Aufruf des Copy-Ctors darf zwar "wegoptimiert" werden, er muss aber dennoch möglich sein.

    Ganz genau. Der Comeau-Compiler hat dafür eine sehr schöne Fehlermeldung:

    error: "B::B(const B &)" is inaccessible
    (Even though the copy was eliminated, the standard
    still requires it to be accessible)

    Es handelt sich hier um copy-initialization und die erfordert immer einen zugreifbaren Copy-Ctor (im Gegensatz zur direct-initialization), auch wenn der eigentliche Aufruf wegoptimiert werden darf und in der Regel auch wird.

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=copyvsdirect#Answ

    Der Copy-C'tor hat als Parameter ein "const B&", kein "B&".

    Na wir wollen doch nicht Klassen wie std::auto_ptr diskriminieren 🙂



  • HumeSikkins schrieb:

    Der Copy-C'tor hat als Parameter ein "const B&", kein "B&".

    Na wir wollen doch nicht Klassen wie std::auto_ptr diskriminieren 🙂

    Nagut, Ausnahmen bestätigen die Regel. 😉


Anmelden zum Antworten