如何用非平凡的构造函数初始化静态类成员?

时间:2013-01-28 18:27:12

标签: c++ windows class visual-c++

它在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 ++中是否存在使用非平凡构造函数初始化静态类成员的“官方”方法?

2 个答案:

答案 0 :(得分:6)

您可能会遇到Static Initialization Order Fiasco。在执行main()之前初始化类或命名空间作用域的静态变量,但初始化顺序取决于链接时间因素。

要解决这个问题,请使用Construct on First Use Idiom,它利用了在首次调用函数时初始化函数范围静态的事实。

答案 1 :(得分:1)

我不希望Vitaliy得到这种例外。 Static Initialization Order Fiasco需要两个对象,其中一个对象的初始化调用另一个对象上的方法

这里我们在MyClass2中有一个静态初始值设定项,它调用另一个类(MyClass1)的构造函数(不是方法)。当然,在调用构造函数之前,我们不需要初始化对象。

总之,我不知道为什么Vitaliy会遇到这个例外。我很想知道答案,但由于静态初始化程序订单Fiasco,似乎不是