static uninitialized Member?
-
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.