我有两个类,Foo
和Bar
。 Bar
包含Foo
的实例,需要初始化该实例,然后再添加文件中的某些数据。初始化列表不应正确,因为在初始化时,计算机尚不知道为Foo
分配了什么值。
class Foo {
int x;
public:
Foo(int new_x) : x(new_x) {}
};
class Bar {
Foo FooInstance;
public:
Bar(const char * fileneme)
/* Auto calls FooInstance() constructor, which does not exist
Shoild I declare it to only avoid this error? */
{
/* [...] reading some data from the file */
// Init a new FooInstance calling FooInstance(int)
FooInstance = Foo(arg);
/* Continue reading the file [...] */
}
};
创建一个新对象,对其进行初始化,然后将其复制为
FooInstance
(如源代码所示)是一个不错的选择吗?还是将
FooInstance
声明为原始指针,然后使用new初始化它? (并在Bar
析构函数中销毁它)初始化
FooInstance
的最优雅方法是什么? 最佳答案
您可以使用委派构造函数(自C++ 11起)和其他函数:
MyDataFromFile ReadFile(const char* filename);
class Bar {
Foo FooInstance;
public:
Bar(const char* fileneme) : Bar(ReadFile(filename)) {}
private:
Bar(const MyDataFromFile& data) : FooInstance(data.ForFoo)
{
// other stuff with MyDataFromFile.
}
};