如何避免需要在初始化列表中初始化成员对象

How do I avoid needing to initialize a member object in the initialization list?

本文关键字:初始化 列表 成员对象 何避免      更新时间:2023-10-16

我正在编写一个C++应用程序,该应用程序利用嵌套在一个"根"对象中的大量子对象。

其中每个都需要按特定顺序初始化,每次初始化之间要执行各种操作,有时需要将先前初始化的操作作为彼此的参数。

但是,我的编译器迫使我在构造函数的初始值设定项列表中初始化这些,坚持认为在构造函数初始化是不够的。例如,我无法执行以下操作:

SomeThing::SomeThing() {
    int argGottenByLibraryCall;
    someLibraryCallToGetArg(&argGottenByLibraryCall);
    m_ChildObject = ChildClass(argGottenByLibraryCall);
}

我已经开始实现一个创建后的初始值设定项函数:

SomeThing::SomeThing() : m_ChildObject() {
    int argGottenByLibraryCall;
    someLibraryCallToGetArg(&argGottenByLibraryCall);
    m_ChildObject.Initialize(argGottenByLibraryCall);
}

然而,这对我来说似乎是一种糟糕的做法。有没有更好的方法让我的编译器 (VC++ 2017) 接受构造函数体内的初始化?

然而,这对我来说似乎是一种糟糕的做法。

不良做法是不使用初始化列表。它们允许您将数据成员标记为const并确保它们已初始化。

解决问题的正确方法是重构代码,以便m_ChildObject具有可在成员初始化列表中使用的正确构造函数。

如果无法做到这一点,请将初始化逻辑包装在函数中,并在成员初始化列表中使用该逻辑:

ChildObjectType makeChildObject() {
    int argGottenByLibraryCall;
    someLibraryCallToGetArg(&argGottenByLibraryCall);
    ChildObjectType result;
    result.Initialize(argGottenByLibraryCall);
    return result;
}
// ...
SomeThing::SomeThing() : m_ChildObject(makeChildObject()) { }