我有以下两个类:
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 constructor
在std::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
我应该重新加载。
答案 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()
静态)。