它在C#中是微不足道的,但在C ++(native,Win32,Visual C ++)中我没有看到解决方案。所以,我有MyClass1类和非平凡的构造函数,而在MyClass2中我想拥有MyClass1类型的静态成员:
MyClass1.h:
class MyClass1
{
public MyClass1(type1 arg1, type2 arg2);
}
MyClass2.h:
class MyClass2
{
public:
static MyClass1 Field1;
}
和MyClass2.cpp:
MyClass1 MyClass2::Field1(arg1, arg2);
我希望这样的代码在初始化期间初始化MyClass2 :: Field并调用MyClass1构造函数。但是,看起来编译器只为Class1分配内存,而且从不调用构造函数,就像我这样做:
MyClass1 MyClass2::Field1 = *(MyClass1 *)malloc(sizeof(MyClass1));
C ++中是否存在使用非平凡构造函数初始化静态类成员的“官方”方法?
答案 0 :(得分:6)
您可能会遇到Static Initialization Order Fiasco。在执行main()
之前初始化类或命名空间作用域的静态变量,但初始化顺序取决于链接时间因素。
要解决这个问题,请使用Construct on First Use Idiom,它利用了在首次调用函数时初始化函数范围静态的事实。
答案 1 :(得分:1)
我不希望Vitaliy得到这种例外。 Static Initialization Order Fiasco需要两个对象,其中一个对象的初始化调用另一个对象上的方法。
这里我们在MyClass2中有一个静态初始值设定项,它调用另一个类(MyClass1)的构造函数(不是方法)。当然,在调用构造函数之前,我们不需要初始化对象。
总之,我不知道为什么Vitaliy会遇到这个例外。我很想知道答案,但由于静态初始化程序订单Fiasco,似乎不是。