c++ - 如何避免需要初始化初始化列表中的成员对象?

标签 c++ class visual-c++ initialization

我正在编写一个 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) 接受构造函数体内的初始化?

最佳答案

This, however, seems like a poor practice for me to follow.

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

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

如果那不可能,请将您的初始化逻辑包装在一个函数中,并在成员初始化列表中使用它:

ChildObjectType makeChildObject() {
    int argGottenByLibraryCall;
    someLibraryCallToGetArg(&argGottenByLibraryCall);

    ChildObjectType result;
    result.Initialize(argGottenByLibraryCall);
    return result;
}

// ...

SomeThing::SomeThing() : m_ChildObject(makeChildObject()) { }

关于c++ - 如何避免需要初始化初始化列表中的成员对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53978220/

相关文章:

c++ - 如何区分控制台程序是在 Powershell 中打开还是在 Windows 终端中打开?

R R6 类和 UseMethod/泛型方法

c++ - 不存在从到 * 的合适转换

windows - TrackPopupMenu "harm"是我的 HMENU 吗?

java - 无法解决类上的符号错误 - Android Studio

使用 Visual C++ Toolkit 2003 和 CodeBlocks 进行调试

c++ - 从私有(private)成员公开 Q_PROPERTY

c++ - 设置一个等于自身的变量实际上在 C++ 中执行吗?

c++ - 'char *args[]' 和 'char **argv' 作为参数的区别

javascript - 类中的jquery函数混淆了this关键字