初始化c++类中的引用成员
Initialize reference member in class C++
我有一个类,其中有一个引用成员,如下所示:
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;
}
,但使用指针也不会伤害你,甚至可能给你更多的灵活性。在这里你可以找到更多关于初始化的信息。构造函数
- 具有引用成员的结构是否具有唯一的对象表示形式
- 初始化右值引用成员
- C++通过绑定到引用成员而缩短临时变量寿命?
- C++为具有引用成员变量的类创建复制构造函数
- 常量和引用成员函数限定符
- C++将引用成员绑定到构造函数参数
- 如果包含引用成员的类中缺少原始变量,为什么它仍然可以访问?
- 初始化指针或引用成员变量以指向另一个成员
- 将常量引用成员设置为临时变量是否安全
- 对象超出范围后,引用成员设置为 0
- 复制构造函数初始化初始化列表中的引用成员会导致指针悬空
- 使用默认构造函数引用成员变量初始化错误
- 如何从派生类访问引用成员变量?
- Visual Studio 2017 允许在构造函数中使用自身初始化引用成员.真的是合法的C++吗?
- 为什么当类具有引用成员时C++编译器不删除复制构造函数
- 引用成员到构造函数参数按值传递
- 在执行不平凡的构造函数之前引用成员
- 具有引用成员变量的多态性
- 从按值构造函数参数初始化的引用成员
- 深度复制包含引用成员(C++)的结构