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