3

我有一个类,其中我有一个参考成员,如下所示:

样本类.h

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

样本类.cpp

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

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

这很明显,因为我应该做的初始化引用成员应该是

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

但是,BodyBlob&这是我将要从中获得的BodyTrackerDevice东西BodyTrackerDevice.getTrackedBody[0],而不是我可以传递给类的构造函数的东西。这里遵循什么正确的方法来消除错误?

4

4 回答 4

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

希望这可以帮助。

于 2013-05-30T08:36:47.727 回答
1

类成员按照其声明的顺序进行初始化。这意味着在_userBody初始化开始时,_device已经初始化,您可以这样做:

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

要考虑的替代方法是使用指针而不是引用。

于 2013-05-30T08:38:18.983 回答
0

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

于 2013-05-30T08:35:54.913 回答
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;    
}

但是使用指针也不会伤害你,甚至可能给你更多的灵活性。 在这里您可以找到有关初始化和构造函数的更多信息

于 2013-05-30T08:44:42.550 回答