2010-03-05 54 views
0

我有擁有私人屬性,它是另一個類引用的類:我怎麼能在我的課初始化引用屬性

class A { 
public: 
    A(); 
    A(B& anotherB); 
private: 
    B& bRef; 
} 

在我的A(B & anotherB),我可以做到這一點:

A::A(B& anotherB) 
    : bRef(anotherB) { 
} 

但是A()呢?我嘗試這樣做:

A::A() 
    : bRef(B()) {} 

但我得到這個錯誤「的錯誤:類型的非const引用無效初始化‘’從臨時類型的‘B B &’。

如何使用B的默認構造函數調用A中的初始化B引用?

謝謝。

回答

2

你必須有一個真實的實例來初始化它。說: bRef(B())創建一個臨時銷燬,因此您的參考將是一個不再存在的對象,因此編譯器錯誤。

你不需要需要來初始化它,除非你根據它沒有被初始化做出一些決定。在這種情況下,您可以使用一個bool initialized;成員來跟蹤狀態。

如果您想將其初始化爲NULL之類的東西,請改用指針。

0

如果您知道該字段始終保存有效的引用,則應該使用引用字段爲您的類建模。在你的情況下,你有你想要引用的默認構造函數指向一個虛擬值,它應該更適合用指針字段進行建模。您不能將NULL分配給引用,也不應指向堆棧上的對象創建,並且只在範圍內有效。

+0

你指的是「你不能分配空引用」對吧? – YeenFei 2010-03-05 03:28:00

+0

是啊對不起,一個錯字,現在會修復它 – 2010-03-05 03:50:42

0

參考文獻總是指的是有效的對象。因此,如果沒有有效的B對象,則無法初始化bRef。

建議:考慮將A :: A()私有化並且不實現它。

+0

A :: A()被遺留代碼使用,我無法修改它。 – michael 2010-03-05 03:37:52

+0

我看到..然後我很好奇你爲什麼需要在其初始化列表中添加bRef。 – Arun 2010-03-05 03:58:45

1

如果你確實真的想要使用引用,但仍然保留默認構造函數,那麼可以設置一個代表null或默認狀態的全局(或靜態文件)B實例,無論您希望將默認A使用。

A::A() 
: bRef(nullB) {} 
0

用C++ - 11,你可以建立類似:

class A { 
public: 
    A(); 
    A(B& anotherB); 
private: 
    B& bRef = *(B*)(0); 
    // Or assign bRef with an accessible (static) instance of `B` previously created elsewhere 
} 

- 但是:bRef被分配一個NULL指針,你只要有分配的B有效實例的責任您創建了一個A的實例。

請注意,這種構造是一種危險的舊式風格。

相關問題