2013-11-02 52 views
0

如果這個尺寸是一個非常簡單的問題,我很抱歉,但我是新來的c + +和工作在一個簡單的vocable教練了解c + +。 (來自java ..)傳遞給構造函數的一個引用

我想通過一個const FileManager作爲我的邏輯參考。但我沒有得到它的工作。我不想擁有副本或其他內容。

所以我想這樣的:(主)

FileManager& file = FileManager(); 
Logic logic = Logic(file); 

內部的邏輯的,我想存儲參考:

class Logic 
{ 
public: 

    Logic(const FileManager& manager); 
    ~Logic(); 

private: 
    const FileManager& m_fileManager; 
}; 

Logic::Logic(const FileManager& manager) : 
{ 
    m_fileManager = manager; 
} 

感謝

+2

在C++文本中查找「構造函數初始值設定項列表」。引用成員變量*是必需*,用上述方式初始化(​​和const成員一樣)。 – WhozCraig

+1

您通常將指針而不是引用存儲爲成員。另外,不要打電話給你的班級經理。它很混亂,很可能違反了SRP。你也想讓你的構造函數爲'explicit'。 – rightfold

+0

@rightfold我通常存儲引用,當引用必須引用一個對象。在極少數情況下,那個引用是可選的,並且不必指向一個對象,我使用一個指針。 –

回答

7

一旦身體輸入構造函數時,所有成員變量都已經初始化。此後,您只能分配給他們。這不能用於引用 - 正如我們所知,它們需要在其生命週期開始時進行初始化。

你需要使用成員初始化列表:

Logic::Logic(const FileManager& manager) 
    : m_fileManager(manager) // m_fileManager is initialized here 
{ 
} 

考慮一下,如果你真的想要一個參考成員。首先,他們讓你的班級不可轉讓。智能指針可能是更好的選擇。

+0

因此,如果我有這個列表,它是自動的inited?我如何正確使用它呢? 它不應該是可轉讓的,但規則可用,而不是副本。 – BennX

+0

+1爲一般的答案,我希望我可以再次+1,提到const成員引用的缺點(特別是非默認賦值條件)。 – WhozCraig

+0

@BennX是的,它在構造對象時自動初始化。如果你可以在沒有分配邏輯對象的情況下生活,你可以保留一個引用成員。但要確保它不會超過它初始化的'FileManager'對象,因爲那樣你就會有一個懸而未決的引用。 – jrok

0

你的例子有三個缺陷。第一個,是你嘗試初始化一個臨時對象沒有const引用:

FileManager& file = FileManager(); 

最有可能你只是想在這裏使用一個文件管理器實例:

FileManager file; 

其次,引用必須被初始化。您可以通過使用初始化列表語法實現這一點:

Logic::Logic(const FileManager& manager) 
    : m_fileManager(manager) 
{ 
} 

此外,初始化,您使用的邏輯要求邏輯是分配。簡單地使用:

Logic logic(file); 

如果您在類中有引用成員,那麼該類的對象默認情況下是不可分配的。

相關問題