C ++ init类成员构造函数

时间:2015-09-15 19:55:29

标签: c++ class constructor initialization

我有两个班级,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的最优雅方式是什么?

2 个答案:

答案 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())
    {
        // ...
    }

    // ...
};