在C ++类中初始化引用成员

时间:2013-05-30 08:30:14

标签: c++ class

我有一个班级,我有一个参考成员如下:

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;
}
  

错误:SampleClass的构造函数必须显式初始化引用成员_userBody

这是显而易见的,因为我应该做的初始化参考成员应该是

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

但是,BodyBlob&是我将BodyTrackerDevice作为BodyTrackerDevice.getTrackedBody[0]获取的内容,而不是我可以传递给类的构造函数的内容。在这里摆脱错误的正确方法是什么?

4 个答案:

答案 0 :(得分: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 ] );
}

希望这有帮助。

答案 1 :(得分:1)

类成员按其声明的顺序初始化。这意味着,在_userBody初始化开始时,_device已经初始化,您可以执行此操作:

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

考虑的另一种方法是使用指针而不是引用。

答案 2 :(得分:0)

您不必在初始化列表中初始化另一个变量。你可以在那里放一个表达: _userBody(BodyTrackerDevice.getTrackedBody[0]) { } 或者你甚至可以调用一个函数来返回你想要初始化它的值,如果它不是一个简单的值: _userBody(getMyData()) {}

答案 3 :(得分:0)

只需使用指针:

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

引用必须始终在构造函数中初始化。有时你可以用一些初始值初始化它,比如说

_userBody(userBody())

然后使用例如

更改适合的内容
void setUserBody(BodyBlob& b){
    _userBody=b;    
}

但使用指针也不会对您造成伤害,甚至可能会给您更大的灵活性。 here您可以找到有关初始化的更多信息。构造