2011-10-10 56 views
0

我想从一个相机SDK中将函数转换为类,因此我可以分别调用函数的不同部分(初始化,捕获图像,清理)。我有一个问题是,在一些函数变量的定义:初始化引用变量作为类成员

type& var = type::init(); 

,当我做这不起作用:

class myClass 
{ 
private: 
type& var; 
}; 

我试图改变:

type& var; 

要:

type* var; 

这WO当我把所有东西放在一个单独的函数中,但是当我尝试将它分解成一个类中的单独函数时,代码编译但是不运行。我的代码有根本错误吗?

编辑: 的代码是从Basler的SDK,原来的代码是:

Pylon::CTlFactory& TlFactory = Pylon::CTlFactory::GetInstance(); 

在头文件:

Pylon::CTlFactory *TlFactory; 

而且cpp文件:

TlFactory = &Pylon::CTlFactory::GetInstance(); 

如前所述,当所有的代码都在一个函数中时,它编译并运行正常,只有在我时把它分解成我有问题的类函数...

+0

如果您运行时的问题,您需要向我们展示更多的代码。就像'var'是如何初始化的? – Mahesh

+0

感谢Mahesh,已添加更多代码。 –

回答

7

引用是不可赋值的。当你有一个作为类成员对象的引用时,你需要在构造函数中初始化它。为此,请使用构造函数初始化列表:

class myClass 
{ 
public: 
    myClass(type& some_var) 
     : var(some_var) 
    {} 

private: 
    type& var; 
}; 
+0

现在编写代码的方式(不是我的),如果我使用构造函数initilisation列表,例如如果我有两个变量,第二个依赖于第一个变量。这就是为什么我试图改变对指针的引用。 –

+0

@chocobo_ff:依赖关系很好,类的成员保证按它们在类定义(而不是初始化程序列表)中的顺序进行初始化。 – ybungalobill

+0

非常好,谢谢你的回答,花了一段时间,但认为我已经解决了它:) –

0

除了K-BALLO的回答,请注意C++作用域规则这个(有用,IMO)功能: 可以公开非常相同的名称正式参数在构造函数中。这样可以方便地将代码粘贴到&上,避免了梦想'使用一次'名字的需要。从参考更改为指针后

class myClass 
{ 
public: 
    myClass(type& var) 
     : var(var) 
    {} 

private: 
    type& var; 
}; 
0
class myClass 
{ 
public: 
    myClass() : var(Pylon::CTlFactory::GetInstance()) 
    { 
     // rest of init logic 
    } 
private: 
    Pylon::CTlFactory& var; 
}; 
+0

这样做的问题是,我有类似'IPylonDevice&Camera = * TlFactory.CreateDevice(devices [0]);',接下来是' IStreamGrabber&StreamGrabber = * Camera.GetStreamGrabber(0);'这是依赖于'相机'...在这种情况下,我该怎么办?谢谢。 –

+0

只是做同样的事情。这应该可以正常工作,只要你在类声明中的'StreamGrabber'之前定义了'Camera'。 – Ayjay