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

3

我有一个类,在这个类中我有一个引用成员如下:

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

错误:必须显式初始化引用成员“_userBody”的SampleClass构造函数。
这是显而易见的,因为我应该做的是初始化引用成员:
SampleClass::SampleClass(bool mirror, BodyBlob& bodyBlob) : _userBody(bodyBlob){
...
}

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

2
请使用指针代替... - bash.d
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 ] );
}

希望这能有所帮助。

1

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

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

考虑的另一种选择是使用指针而不是引用。


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

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接