2015-06-24 215 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()) 
    { 
    } 

- - 這樣你就可以從任何地方進行設置,而不僅僅是從文件中進行設置。

相關問題