4

这在 C# 中是微不足道的,但在 C++(本机、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++ 中是否有任何“官方”方式来使用非平凡的构造函数初始化静态类成员?

4

2 回答 2

6

您可能会遇到静态初始化订单惨败。类或命名空间范围的静态变量在main()执行之前被初始化,但初始化的顺序取决于链接时间因素。

为了解决这个问题,请使用Construct on First Use Idiom,它利用了函数作用域静态变量在函数第一次被调用时被初始化的事实。

于 2013-01-28T19:12:09.420 回答
1

我不希望 Vitaliy 会遇到这种例外情况。静态初始化顺序 Fiasco需要两个对象,其中一个对象的初始化调用另一个对象的方法

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

总之,我不知道为什么 Vitaliy 会得到这个异常。我很想知道答案,但似乎不是由于静态初始化程序订单惨败。

于 2015-06-21T17:45:40.277 回答