C++ init类成员构造函数

Ale*_*lex 1 c++ constructor initialization class

我有两节课,FooBar.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 [...] */
        }
};
Run Code Online (Sandbox Code Playgroud)

创建一个新对象,初始化它然后FooInstance如源中所示复制它是一个不错的选择?
或者可能声明FooInstance为原始指针,然后用新的初始化它?(并在Bar析构函数中销毁它)
初始化最优雅的方法是FooInstance什么?

Jar*_*d42 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.
        }
};
Run Code Online (Sandbox Code Playgroud)