在课程

时间:2015-12-25 07:42:10

标签: c++ pointers c++11

我有以下两个类:

class foo{
public:
     foo(){
         Configuration config;
         config.a=5;
         config.b=5;
         //...
         config.z=5;
         eng=Engine(config);
     }
private:
     Engine eng;
}

class Engine{
public:
    Engine(){
         //Very have model loading from hard disk is occurs here
         //This loading is depend on the values of config
    };
    Engine(Configuration const& config):config(config){
         //Very have model loading from hard disk is occurs here
         //This loading is depend on the values of config
    }
private:
    Configuration config;
}

很明显,在eng foo中初始化constructor成员变量的方式非常糟糕,因为eng已初始化两次(这非常昂贵)。为了解决这个问题,我将eng设为unique_ptr并使用foo constructorstd::make_unique初始化了一次:

class foo{
    public:
         foo(){
             Configuration config;
             config.a=5;
             config.b=5;
             //...
             config.z=5;
             eng=std::make_unique<Engine>(config);
         }
    private:
         std::unique_ptr<Engine> eng;
    }

这解决了不必要的初始化问题。但是,我认为我已经以错误的方式解决了它。我看不出使用pointers的明显原因。我认为stack member variables有一个更好的解决方案。

问题是:是否应该尽可能避免基于指针的解决方案?如果是,对我的案例最好的解决方案是什么?

修改

我可能会想到一个简单的解决方案,我应该为setter类中的config提供engine方法。所以,我可以在加载后设置它。这不是一个选项,因为加载过程取决于config。因此,如果我更改config我应该重新加载

1 个答案:

答案 0 :(得分:5)

只需将Configuration的准备工作移至成员函数:

class foo{
public:
     foo() : eng(prepare_config()){
     }

     Configuration prepare_config() {
         Configuration config;
         config.a=5;
         config.b=5;
         //...
         config.z=5;
         return config;
     }
private:
     Engine eng;
}

确保您无法访问foo中的任何prepare_config()成员(或只是使prepare_config()静态)。