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

5

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

2
MyClass1 MyClass2::Field1(arg1, arg2); 将调用适当的构造函数。请展示一个 sscce ,说明在哪里出现了问题。 - chris
3
当心C++中的“静态初始化顺序惨案”。 - Fred Larson
是的,你说得对,@Fred Larson,看起来初始化已经完成了,但时间太晚了。 - Vitalii
2个回答

7
你可能会遇到静态初始化次序问题。类或命名空间范围的静态变量在main()执行之前初始化,但初始化顺序取决于链接时间因素。
为解决此问题,请使用第一次使用构造惯用法,利用函数作用域静态变量在首次调用函数时初始化的特性。

2
我不会预料到Vitaliy所遇到的这种异常。静态初始化顺序混乱需要两个对象,其中一个对象的初始化调用了另一个对象的方法
在这里,我们有一个静态初始化器在MyClass2中调用了另一个类(MyClass1)的构造函数(而非方法)。当然,在调用构造函数之前,我们不需要初始化对象。
总之,我不知道为什么Vitaliy会遇到这个异常。我很想知道答案,但似乎这并不是由于静态初始化器顺序混乱引起的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接