我有两个类,FooBarBar包含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.
        }
};

07-26 09:37