【问题标题】:How to initialize static class member with nontrivial constructor?如何使用非平凡的构造函数初始化静态类成员?
【发布时间】:2013-01-28 18:27:11
【问题描述】:

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

【问题讨论】:

  • MyClass1 MyClass2::Field1(arg1, arg2); 将调用适当的构造函数。在没有问题的地方显示sscce
  • 是的,你说得对,@Fred Larson,看起来初始化已经完成,但为时已晚。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我没想到 Vitaliy 会遇到这种异常。 Static Initialization Order Fiasco 需要两个对象,其中一个对象的初始化调用另一个对象的方法

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      相关资源
      最近更新 更多