c++ - 在 C++ 中,当它们具有依赖项时,我应该如何在初始化列表中强制执行组合对象构造函数的顺序

标签 c++ constructor ctor-initializer

如果我有一个组合其他具有相互依赖性的对象的类,我应该(如何)强制执行它们的构造顺序?

例如

class Parent
{
    Child1 c1;
    Child2 c2;
};

假设 Child2 的构造函数需要一个 Child1&,我想将 c1 传递给 c2 构造函数。

如果我只执行以下...

Parent::Parent()
    : c2(c1)
{
}

...这可能不是一件好事,因为在运行 c2 的初始化程序时 c1 可能尚未构造?或者在类声明中 c1 在 c2 之前就足够了吗?

或者我应该显式地引用 c1 构造函数(如果这不是必需的,那么这样做以使其显式化是一个好习惯吗?)。例如

class Parent
{
    Child1 c1;
    Child2 c2;
};

Parent::Parent()
    : c1()
    : c2(c1)
{
}

最佳答案

成员总是按照声明的顺序构造。所以如果你有:

class Parent
{
    Child1 c1;
    Child2 c2;
};

你保证 c1 将在 c2 之前构造。所以,如果 c2 需要一个 Child1&,那么这是完美定义的:

Parent::Parent()
    : c2(c1)
{
}

c1 将被默认构造,然后 c2 将使用绝对已经构造的 c1 构造。

关于c++ - 在 C++ 中,当它们具有依赖项时,我应该如何在初始化列表中强制执行组合对象构造函数的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018933/

相关文章:

c++ - 对单参数构造函数使用 explicit 关键字

c++ - 我可以调用虚函数来初始化基类子对象吗?

iphone - 在 iPhone 应用程序中使用 C++ 结构

javascript - 如何使用 call() 进行继承。错误 : Class constructor cannot be invoked without 'new'

c++ - 如何在构造函数的成员初始化列表中调用两个函数?

c++ - 构造函数中冒号后的变量

c++ - 未定义的引用谷歌 Protocol Buffer 类

c++ - 在 OpenGL 中围绕对象而不是相机周围的对象旋转 'camera'

c++ - 从旧的 Borland C++ 迁移到 Visual C++ Express

android - 将音乐播放器守护进程 (MPD) 移植到 Android