使用文件输入中的值初始化 class 中的 const 成员变量

Initialise const member variables in class using values from file input

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

// 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 如果可以 how/where 我应该这样做吗?

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

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())
    {
    }

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

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

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 私有的!)。性能影响应该可以忽略不计(前进和移动操作通常很便宜),除非您在一些紧密的内部循环中初始化数百万个这些对象。