Hum*_*awi 1 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;
}
Run Code Online (Sandbox Code Playgroud)
很明显,初始化eng成员变量的foo constructor方式非常糟糕,因为eng已初始化两次(这是非常昂贵的).为了解决这个问题,我在使用中做了engas 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;
}
Run Code Online (Sandbox Code Playgroud)
这解决了不必要的初始化问题.但是,我认为我已经以错误的方式解决了它.我看不出明显的使用理由pointers.我认为有一个更好的解决方案stack member variables.
问题是:是否应该尽可能避免基于指针的解决方案?如果是的话,我案例的最佳解决方案是什么?
编辑:
有人可能会想到一个简单的解决方案,我应该在课堂上提供一种setter方法.所以,我可以在加载后设置它.这不是一个选项,因为加载过程取决于.所以,如果我改变了,我应该重新加载.configengineconfigconfig
只需将准备工作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;
}
Run Code Online (Sandbox Code Playgroud)
确保您不访问任何foo成员prepare_config()(或只是prepare_config()静态).