如何避免需要在初始化列表中初始化成员对象
How do I avoid needing to initialize a member object in the initialization list?
我正在编写一个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()) { }
相关文章:
- C++类 - 初始化列表 - 递归 - 按值传递
- 在初始化列表之外手动调用基类的构造函数
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- std::map与谓词与初始化列表
- 类内初始化与构造函数初始化列表的顺序
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++初始化列表与分配值
- C++初始化列表中的向量集大小或调整大小
- 在构造函数初始化列表中使用 std::variant
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 解释了构造函数成员初始化列表
- 使用初始化列表时如何获取私有数据?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何在成员初始化列表中声明共享指针
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 使用整数初始化列表初始化长双精度的向量
- 是否可以在C++中使用初始化列表设置数组的特定成员?