2011-10-10 78 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