c++ - 如何避免需要在初始化列表中初始化成员对象?
问题描述
我正在编写一个 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# - James Montemagno 的 Xam.Plugins.Settings 似乎没有保存我的设置
- default-value - Programmatically set default column values based on folder in SharePoint Online
- linux - 如何获取plesk系统用户使用php命令行的权限
- java - 如果firebase中有相同的值,如何创建条件
- spring-boot - 使用 Spring Boot、Gradle 和 IDEA 显示控制台
- ios - 托管对象上下文的最佳设置
- php - 数据表长度未定义
- facebook-graph-api - Facebook Broadcast api 需要页面和应用级别的消息权限?
- javascript - 用java打开浏览器
- c# - 如何将数据行转换为对象数组?