【问题标题】:C++ How does order of instance creation matter? [closed]C++ 实例创建的顺序有什么影响? [关闭]
【发布时间】:2015-09-11 12:18:23
【问题描述】:

我有一个创建其他类实例的类,当我调用它们时,编译器会警告我实例的顺序。为什么这有关系?无论顺序如何,它都做同样的工作。

例如我的核心类头文件中有这个(核心类处理游戏循环):

HUD hud;
World myWorld;

像这样他们会做他们需要做的一切。但是编译器给出了警告:

'Core::myWorld' will be initialized after [-Wreorder]|

然后,如果我将 myWorld 实例放在 hud 实例之上,它就不会再给我警告了。我只是想知道,它们的顺序到底有什么关系?

【问题讨论】:

  • 在不知道HUDWorld 是什么的情况下无法分辨。 HUD 指的是 World 中的某物吗?
  • 您能否发布更多关于此的信息,例如您的构造函数?

标签: c++ class instance creation


【解决方案1】:

警告是,在构造函数初始化器列表中,您在 HUD 之前初始化 World,但实际上成员将按照在类中声明的顺序进行初始化。

只是小例子,可能会更糟:

class B
{
public:
   B(int i) : value(i) {}
private:
   int value;
};

class A
{
public:
   A() : value(10), b(value)
   {
   }
private:
   B b;
   int value;
};

这里b 将在value 之前初始化,因此,某些内容将被发送到b 构造函数,而不是程序员想要的10

【讨论】:

  • 我认为问题是为什么这很重要。你现在用一个例子回答了:-)
【解决方案2】:

struct C
{
    C() : p(std::make_unique<int>(42)), j(*p) {} // initialization doesn't use this order.

    // but the order here:
    int j;
    std::unique_ptr<int> p;
};

您将取消对nullptr 的引用,因为jp 之前初始化。

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2018-01-24
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多