我有以下两个类:
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
as 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(config); } private: std::unique_ptr eng; }
这解决了不必要的初始化问题.但是,我认为我已经以错误的方式解决了它.我看不出明显的使用理由pointers
.我认为有一个更好的解决方案stack member variables
.
问题是:是否应该尽可能避免基于指针的解决方案?如果是的话,我案例的最佳解决方案是什么?
编辑:
有人可能会想到一个简单的解决方案,我应该在课堂上提供一种setter
方法.所以,我可以在加载后设置它.这不是一个选项,因为加载过程取决于.所以,如果我改变了,我应该重新加载.config
engine
config
config
只需将准备工作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()
静态).