C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Statische Member mit nichttrivialem Konstruktor

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Julien Koenen
Guest





PostPosted: Sat Dec 06, 2003 3:24 pm    Post subject: Statische Member mit nichttrivialem Konstruktor Reply with quote



Hi,

ich habe eine frage zur Initialisierung von statischen Member-Variablen. Und
zwar liefert folgendes Programm bei mir (VC6,VC.net 2003)
?überraschenderweise? keine Ausgabe. Ich dachte, dass statische Member mit
nicht-trivialem Konstruktor/Destruktor immer angelegt werden müssen ?!?.
Kann mich jemand aufklären ?

Vielen dank und schönen Gruß
Julien Koenen

Code:

#include <cstdio>
using namespace std;

class B
{
B()
{
printf( "Hallon" );
}

~B()
{
printf( "Ciaon" );
}
};

class A
{
public:
static B b;
};

int main()
{
A a;
return 0;
}


--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Bernd Nawothnig
Guest





PostPosted: Sat Dec 06, 2003 5:13 pm    Post subject: Re: Statische Member mit nichttrivialem Konstruktor Reply with quote



Hi Julien,

On Sat, 6 Dec 2003, Julien Koenen <mail (AT) julien-koenen (DOT) net> wrote:

Quote:
zwar liefert folgendes Programm bei mir (VC6,VC.net 2003)

Interessant, g++ warnt immerhin wegen des nicht öffentlichen
Konstruktors/Destruktors.

Quote:
?überraschenderweise? keine Ausgabe.

Deine Überraschung ist schon nachvollziehbar, denn ...

Quote:
Ich dachte, dass statische Member mit nicht-trivialem
Konstruktor/Destruktor immer angelegt werden müssen ?!?.

.... Du musst sie nochmal explizit anlegen, sonst gibt es sie nicht:

Quote:
[code]
#include using namespace std;

class B
{

public:

Quote:
B()
{
printf( "Hallon" );
}

~B()
{
printf( "Ciaon" );
}
};

class A
{
public:
static B b;
};

B A::b; // erst hierdurch wird das statische Member wirklich physisch
// angelegt

Quote:
int main()
{
A a;
return 0;
}

So sollte es laufen.

Aber keine Sorge, ich bin exakt darüber auch schon gestolpert :-)



Bernd

--
Those who desire to give up freedom in order to gain security,
will not have, nor do they deserve, either one. [T. Jefferson]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Tibor Pausz
Guest





PostPosted: Sat Dec 06, 2003 5:14 pm    Post subject: Re: Statische Member mit nichttrivialem Konstruktor Reply with quote



Julien Koenen <mail (AT) julien-koenen (DOT) net> wrote:
Quote:
Vielen dank und schönen Gruß
Julien Koenen

Statische Member Variablen müssen extra initialisiert werden.

#include <iostream>

class B {
public:
B () {
std::cout << "Hallo"
}
~B () {
std::cout << "Ciaon";
}
};

class A {
public:
A () {};
~A () {};
private:
static B b;
}

B A::b; // die Zeile ist notwendig, anderfalls wird A::b nicht
initialisiert

int main () {
A a;

return 0;
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Julien Koenen
Guest





PostPosted: Sat Dec 06, 2003 10:46 pm    Post subject: Re: Statische Member mit nichttrivialem Konstruktor Reply with quote

Quote:
... Du musst sie nochmal explizit anlegen, sonst gibt es sie nicht:

Sorry,

hatte ich beim posten vergessen (in meinem test-programm ist es drin)
NUR: Das löst das Problem nicht.. Denn der Konstruktor/Destruktor wird
trotzdem nicht aufgerufen. Erst wenn ich den statischen Member z.B. über
eine statische Member-Funktion zurückgebe UND im main benutze (aufruf der
funktion reicht) wird das Objekt auch konstruiert.

Gruß
Julien

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Bernd Nawothnig
Guest





PostPosted: Sun Dec 07, 2003 4:30 am    Post subject: Re: Statische Member mit nichttrivialem Konstruktor Reply with quote

Hi Julien,

On Sat, 6 Dec 2003, Julien Koenen <mail (AT) julien-koenen (DOT) net> wrote:

Quote:
hatte ich beim posten vergessen (in meinem test-programm ist es drin)
NUR: Das löst das Problem nicht.. Denn der Konstruktor/Destruktor wird
trotzdem nicht aufgerufen.

Kann eigentlich nicht sein (hier geht es nämlich) - hast Du daran gedacht,
die c/dtors public zu machen? In Deinem ersten Posting fehlte das nämlich
auch.

Quote:
Erst wenn ich den statischen Member z.B. über eine statische
Member-Funktion zurückgebe UND im main benutze (aufruf der funktion
reicht) wird das Objekt auch konstruiert.

Strange - müsste mal mein Notebook mit XP und VS.NET auspacken. Könnte
natürlich theoretisch sein, dass der MS-Compiler da was wegoptimiert. Ob er
das - wenn ja - darf, wäre eine interessante Frage an die Experten hier. Ich
würde spontan vermuten: er darf es nicht.



Bernd

--
Those who desire to give up freedom in order to gain security,
will not have, nor do they deserve, either one. [T. Jefferson]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.