 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Olaf Krzikalla Guest
|
Posted: Mon Nov 03, 2003 11:55 am Post subject: Re: static list in template |
|
|
Hi,
Terence wrote:
| Quote: | // begin test.cpp
#include <iostream
#include "test.h"
using namespace std;
template A<T>::alist;
template class A<L>;
static B *b_ex = new B(E());
int main() {
cout << A
return 0;
}
// end test.cpp
|
Was passiert, wenn Du b_ex im main initialisierst:
int main()
{
B *b_ex = new B(E());
cout << A
return 0;
}
Wenn es dann funktioniert und b_ex global sein muß, dann brauchst Du ein
->Singleton Pattern.
Das Ganze scheint ein Problem der Initialisierungsreihenfolge zu sein.
Im Allg. werden globale Variablen innerhalb einer Übersetzungseinheit in
der Reihenfolge ihrer Definition initialisiert. Nun wird zwar die
Instantiierung von A<L> explizit vor der Initialisierung von b_ex
angefordert, allerdings weiß ich nicht, ob damit auch alle statischen
Member dieser Instantiierung vor b_ex initialisiert werden.
Viele Compiler verschieben die Compilation von Instantiierungen an das
Ende einer
Übersetzungseinheit. Damit würde hier mittelbar auch die statische Liste
A<L>::alist erst nach b_ex (und damit zu spät) initialisiert werden.
Gibt es im Standard irgendwelche Auslassungen über dieses Problem?
MfG
Olaf Krzikalla
--
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 |
|
 |
Olaf Krzikalla Guest
|
Posted: Tue Nov 04, 2003 11:09 am Post subject: Re: static list in template |
|
|
Hi,
Terence wrote:
| Quote: | Was besagt das "Singleton Pattern" nochmals (vielleicht kleines
Code-Snippet wäre nett - veranschaulicht Prinzipien immer gut)?
Upps, ich dachte, das steht in unserer FAQ. Tut es aber nicht. Deswegen |
hier ein Programmschnipsel:
class A { /*...*/ };
A& globalVar()
{
static A var;
return var;
}
int main()
{
globalVar().doSomething(); //Klammern nicht vergessen
}
Der Clou ist jetzt, dass 'var' als statische Variable einer Funktion
'globalVar' erst dann initialisiert wird, wenn diese Funktion das erste
Mal aufgerufen wird. Damit stimmt automatisch die
Initialisierungsreihenfolge (von abstrusen zyklischen Abhängigkeiten
abgesehen).
Man kann das jetzt noch verfeinern, wenn man wirklich nur eine Instanz
von A erlauben will, indem globalVar() zu einer statischen
Member-Funktion von A und alle c'tors von A privat werden.
Hth
Olaf Krzikalla
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Tue Nov 04, 2003 11:30 am Post subject: Re: static list in template |
|
|
Olaf Krzikalla wrote:
| Quote: | Hi,
Terence wrote:
Was besagt das "Singleton Pattern" nochmals (vielleicht kleines
Code-Snippet wäre nett - veranschaulicht Prinzipien immer gut)?
Upps, ich dachte, das steht in unserer FAQ. Tut es aber nicht.
Deswegen hier ein Programmschnipsel:
class A { /*...*/ };
A& globalVar()
{
static A var;
return var;
}
int main()
{
globalVar().doSomething(); //Klammern nicht vergessen
}
Der Clou ist jetzt, dass 'var' als statische Variable einer Funktion
'globalVar' erst dann initialisiert wird, wenn diese Funktion das
erste Mal aufgerufen wird. Damit stimmt automatisch die
Initialisierungsreihenfolge (von abstrusen zyklischen Abhängigkeiten
abgesehen).
|
Dummerweise kann das beim Deinitialisieren dann Ärger machen. 100%ig
sicher ist das also nicht. Das steht zwar vieliecht nicht in der FAQ zu
dieser Gruppe, aber die zu comp.lang.c++ erklärt das recht gut. Siehe
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.13
--
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
|
|