2015-06-24 165 views
1

我要定义一个const变量,它是象类的一部分:初始化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如果是的话我应该怎么做?

+0

只是检查是const引用服务你的目的。 – Ajit

回答

0

,如果你使用一个中间类,这样它是可能的:(!Reader和相应的构造函数是私有的Camera

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)...)) 
    { } 
}; 

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

0

一种选择是初始化设置从一个文件对象,并从它采取必要的值:

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

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

相关问题