我有一个班级,我有一个参考成员如下:
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]
获取的内容,而不是我可以传递给类的构造函数的内容。在这里摆脱错误的正确方法是什么?
答案 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您可以找到有关初始化的更多信息。构造