初始化c++类中的引用成员

Initialize reference member in class C++

本文关键字:引用 成员 c++ 初始化      更新时间:2023-10-16

我有一个类,其中有一个引用成员,如下所示:

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]获得的东西,而不是我可以传递给类的构造函数的东西。消除错误的正确方法是什么?

引用基本上就像指针,但有两个非常重要的区别: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 ] );
}

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

SampleClass::SampleClass(bool mirror)
  : _userBody(_device.getTrackedBody[0])
  , _mirror(mirror)
{ ::: }
可以考虑使用指针来代替引用。

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

用指针代替:

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

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