Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将引用变量初始化为类成员_C++_Class_Reference - Fatal编程技术网

C++ 将引用变量初始化为类成员

C++ 将引用变量初始化为类成员,c++,class,reference,C++,Class,Reference,我正在尝试将一个函数从我正在使用的CameraSDK转换为一个类,这样我就可以分别调用函数的不同部分(初始化、捕获图像、清理)。我遇到的一个问题是函数中的一些变量定义为: type& var = type::init(); 当我这样做时,这不起作用: class myClass { private: type& var; }; 我试图改变: type& var; 致: 当我把所有的东西都放在一个函数中时,这很好,但是当我试图在一个类中将它分解成单独的函数时,代码会编

我正在尝试将一个函数从我正在使用的CameraSDK转换为一个类,这样我就可以分别调用函数的不同部分(初始化、捕获图像、清理)。我遇到的一个问题是函数中的一些变量定义为:

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