【问题标题】:Initialise const member variables in class using values from file input使用来自文件输入的值初始化类中的 const 成员变量
【发布时间】:2015-06-24 07:09:21
【问题描述】:

我想定义一个 const 变量,它是类的一部分,例如:

// camera.h
class Camera{
public:
    Camera(std::string file);
    ~Camera() {}
    const size_t FRAME_HEIGHT;
    const size_t FRAME_WIDTH;
private:
    std::string file;
    cv::VideoCapture cap;
    Read();
};

_____________________________________

// camera.cpp
Camera::Camera(std::string file) : file("settings.yml") {
    //...
    read();
    cap.open(0);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, FRAME_HEIGHT);
    cap.set(CV_CAP_PROP_FRAME_WIDTH, FRAME_WIDTH);
}

void Camera::read(){
    // read something
}

但是,这不能使用初始化列表,因为我首先必须从设置文件中读取这些数据。

在调用read() 之后,我设置了我的const 变量FRAME_HEIGHTFRAME_WIDTH

是否可以留下他们const,如果可以,我应该如何/在哪里这样做?

【问题讨论】:

  • 只需检查 const 引用是否符合您的目的。

标签: c++ initialization constants


【解决方案1】:

如果你使用中间类是可能的,像这样:

class Camera {
    struct Reader {
        int value;

        Reader(bool x) {
            // Do whatever you like
            value = x ? 42 : 0xDEAD;
        }
    };
    Camera(Reader&& r) : value(::std::move(r.value)) { }

public:
    int const value;

    template<typename... V>
    Camera(V... args)
    : Camera(Reader(std::forward<V>(args)...))
    { }
};

这有效地为初始化增加了另一个阶段,但仍然保持封装(Reader 和相应的构造函数是 Camera 私有的!)。性能影响应该可以忽略不计(前进和移动操作通常很便宜),除非您在某个紧密的内部循环中初始化数百万个这样的对象。

【讨论】:

    【解决方案2】:

    一种选择是从文件中初始化设置对象,并从中获取所需的值:

    class Camera
    {
        // note this section is moved to the beginning,
        // so file and settings are initialized before FRAME_HEIGHT and FRAME_WIDTH
    private:
        std::string file;
        Settings settings;
    public:
        Camera(std::string file)
            : file(file)
            , settings(file)
            , FRAME_HEIGHT(settings.getFrameHeight())
            , FRAME_WIDTH(settings.getFrameWidth())
        {
        }
    
        ~Camera() {}
        const size_t FRAME_HEIGHT;
        const size_t FRAME_WIDTH;
    };
    

    在此之后将Camera构造函数重写为

        Camera(const Settings& settings)
            : FRAME_HEIGHT(settings.getFrameHeight())
            , FRAME_WIDTH(settings.getFrameWidth())
        {
        }
    

    -- 这样您就可以从任何地方进行设置,而不仅仅是从文件中。

    【讨论】:

      猜你喜欢
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多