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

时间:2018-12-30 14:00:05

标签: 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)在构造函数体内接受初始化?

1 个答案:

答案 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