C++ 将引用变量初始化为类成员
我正在尝试将一个函数从我正在使用的CameraSDK转换为一个类,这样我就可以分别调用函数的不同部分(初始化、捕获图像、清理)。我遇到的一个问题是函数中的一些变量定义为:C++ 将引用变量初始化为类成员,c++,class,reference,C++,Class,Reference,我正在尝试将一个函数从我正在使用的CameraSDK转换为一个类,这样我就可以分别调用函数的不同部分(初始化、捕获图像、清理)。我遇到的一个问题是函数中的一些变量定义为: type& var = type::init(); 当我这样做时,这不起作用: class myClass { private: type& var; }; 我试图改变: type& var; 致: 当我把所有的东西都放在一个函数中时,这很好,但是当我试图在一个类中将它分解成单独的函数时,代码会编
type& var = type::init();
当我这样做时,这不起作用:
class myClass
{
private:
type& var;
};
我试图改变:
type& var;
致:
当我把所有的东西都放在一个函数中时,这很好,但是当我试图在一个类中将它分解成单独的函数时,代码会编译但不会运行。我的代码有什么根本性的错误吗
编辑:
代码来自Basler的SDK,原始代码为:
Pylon::CTlFactory& TlFactory = Pylon::CTlFactory::GetInstance();
在头文件中:
Pylon::CTlFactory *TlFactory;
和cpp文件:
TlFactory = &Pylon::CTlFactory::GetInstance();
如前所述,当所有代码都在一个函数中时,它编译并运行良好,只有当我将其分解为类函数时,我才会遇到问题…引用是不可分配的。当引用作为类成员对象时,需要在构造函数中初始化它。为此,请使用构造函数初始化列表:
class myClass
{
public:
myClass( type& some_var )
: var( some_var )
{}
private:
type& var;
};
除了K-Balo的答案外,请注意C++作用域规则的这个(有用的,IMO)特性: 您可以在构造函数中公开与形式参数完全相同的名称。这允许方便的代码剪切和粘贴,避免了“使用一次”名称的梦想
class myClass
{
public:
myClass( type& var )
: var( var )
{}
private:
type& var;
};
如果从引用更改为指针后出现运行时问题,则需要向我们显示更多代码。比如,
var
是如何初始化的?感谢Mahesh,添加了更多的代码。目前编写代码的方式(不是我的)太复杂了,如果我使用构造函数初始化列表,例如,如果我有两个变量,第二个变量依赖于第一个变量。这就是我试图更改指针引用的原因。@chocobo\u ff:依赖关系很好,类的成员保证按照它们在类定义(而不是初始值设定项列表)中出现的顺序进行初始化。很好,谢谢你的回答,花了一些时间,但我想我已经解决了:)这样做的问题是,我有一些类似于IPylonDevice&Camera=*TlFactory.CreateDevice(设备[0])
,后跟IStreamGrabber和StreamGrabber=*Camera.GetStreamGrabber(0)代码>取决于摄像机。。。在这种情况下,我该怎么办?谢谢。做同样的事。只要您在类声明中的StreamGrabber
之前定义了Camera
,这应该可以正常工作。
class myClass
{
public:
myClass( type& var )
: var( var )
{}
private:
type& var;
};
class myClass
{
public:
myClass() : var(Pylon::CTlFactory::GetInstance())
{
// rest of init logic
}
private:
Pylon::CTlFactory& var;
};