当前位置:  开发笔记 > 编程语言 > 正文

在课堂上初始化成员变量一次

如何解决《在课堂上初始化成员变量一次》经验,为你挑选了1个好方法。

我有以下两个类:

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已初始化两次(这是非常昂贵的).为了解决这个问题,我在使用中做了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(config);
         }
    private:
         std::unique_ptr eng;
    }

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

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

编辑:

有人可能会想到一个简单的解决方案,我应该在课堂上提供一种setter方法.所以,我可以在加载后设置它.这不是一个选项,因为加载过程取决于.所以,如果我改变了,我应该重新加载.configengineconfigconfig



1> Petr..:

只需将准备工作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()静态).

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有