2013-05-30 109 views
2

我有一個類,其中我有一個基準部件如下:初始化基準部件

SampleClass.h

class SampleClass{ 
public: 
SampleClass(bool mirror=false); 
void updateFunction(); 
private: 
BodyTrackeDevice _device; 
BodyBlob& _userBody; 
BodyMuscle _muscle; 
bool _mirror; 
}; 

SampleClass.cpp

SampleClass::SampleClass(bool mirror) 
{ 
this->_mirror = mirror; 
} 

Error: Constructor for SampleClass must explicitly initialize the reference member _userBody

這是obvio我們是因爲什麼我應該做初始化參考構件應該是

SampleClass::SampleClass(bool mirror, BodyBlob& bodyBlob) : _userBody(bodyBlob){ 
... 
} 

然而,BodyBlob&是什麼,我會從BodyTrackerDevice越來越爲BodyTrackerDevice.getTrackedBody[0],而不是東西,我可以傳遞給的構造函數班上。這裏採取了哪些正確的方法來擺脫錯誤?

+2

使用指針而不是... –

回答

2

參考基本上都是一樣的指針,但是有兩個很重要的區別: a)創建它們時必須初始化(爲了最大限度地減少懸掛引用與懸掛指針相比的可能性),並且b)不能更改它們指向的對象。

在你的代碼中,你有可能被b)覆蓋的需求,但不適用於a)(你說你會在以後得到_userBody的值,而不是在構建對象時) ,所以你只剩下兩種可能:使用一個簡單的對象(你可以通過複製新值來初始化)[不是很好],或者只是使用指針而不是引用。

class SampleClass { 
public: 
    SampleClass(bool mirror=false); 
    void updateFunction(); 
private: 
    BodyTrackeDevice _device; 
    BodyBlob * _userBody; 
    BodyMuscle _muscle; 
    bool _mirror; 
}; 

SampleClass::SampleClass(bool mirror) 
{ 
    this->_mirror = mirror; 
} 

void SampleClass::updateFunction() 
{ 
    _userBody = &(device.getTrackedBody[ 0 ]); 
} 

希望這會有所幫助。

0

您不必從初始化列表中的另一個初始化變量。你可以把一個表達式中有: _userBody(BodyTrackerDevice.getTrackedBody[0]) { } 或者你甚至可以調用一個函數來返回你想要初始化它的價值,如果它不是一個簡單的價值: _userBody(getMyData()) {}

1

班級成員按照其聲明的順序進行初始化。這意味着,通過時間_userBody初始化開始,_device已經初始化,你可以這樣做:

SampleClass::SampleClass(bool mirror) 
    : _userBody(_device.getTrackedBody[0]) 
    , _mirror(mirror) 
{ ::: } 

另一種考慮是使用一個指針,而不是一個參考。

+2

會downvoter照顧評論? – Angew

0

只用一個指針來代替:

class SampleClass{ 
public: 
    SampleClass(bool mirror=false); 
    void updateFunction(); 
private: 
    BodyTrackeDevice _device; 
    BodyBlob* _userBody; 
    BodyMuscle _muscle; 
    bool _mirror; 
}; 

參考必須在構造函數中總是初始化。有時你可以使用例如

void setUserBody(BodyBlob& b){ 
    _userBody=b;  
} 

但使用指針不也傷害你添加了一些初始值初始化它,說

_userBody(userBody()) 

和合適的東西以後變化,甚至可能給你更靈活。 here你可以找到更多關於初始化&構造函數