 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Julien Koenen Guest
|
Posted: Sat Dec 06, 2003 3:24 pm Post subject: Statische Member mit nichttrivialem Konstruktor |
|
|
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
|
Posted: Sat Dec 06, 2003 5:13 pm Post subject: Re: Statische Member mit nichttrivialem Konstruktor |
|
|
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
|
Posted: Sat Dec 06, 2003 5:14 pm Post subject: Re: Statische Member mit nichttrivialem Konstruktor |
|
|
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
|
Posted: Sat Dec 06, 2003 10:46 pm Post subject: Re: Statische Member mit nichttrivialem Konstruktor |
|
|
| 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
|
Posted: Sun Dec 07, 2003 4:30 am Post subject: Re: Statische Member mit nichttrivialem Konstruktor |
|
|
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 |
|
 |
|
|
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
|
|