我有两个班级,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
的最优雅方式是什么?
答案 0 :(得分:5)
您可以使用委托构造函数(自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.
}
};
答案 1 :(得分:4)
如果可以计算必要的参数,那么您可以使用辅助函数:
class Bar
{
static int ComputeFooArg() { /* ... */ };
public:
Bar(const char * filename) : FooInstance(ComputeFooArg())
{
// ...
}
// ...
};