2008-11-06 217 views
1

我有這樣的代碼:不能在成員初始化列表初始化對象

CCalcArchive::CCalcArchive() : m_calcMap() 
{ 
} 

m_calcMap的定義是這樣的:

typedef CTypedPtrMap<CMapStringToPtr, CString, CCalculation*> CCalcMap; 
CCalcMap& m_calcMap; 

當我在Visual Studio 2008中編譯,我得到這個錯誤:

error C2440: 'initializing' : cannot convert from 'int' to 'CCalcArchive::CCalcMap &' 

我什至不明白它從哪裏得到「int」的錯誤,也爲什麼這不會'工作?這感覺就像我實際上有某種語法錯誤,但是這不是應該如何使用成員初始化列表?此外,AFAIK,MFC類CTypedPtrMap沒有構造函數參數。

回答

2

int從事實CTypedPtrMap有一個構造函數被默認爲10

你正在運行到真正的問題是int論點,即m_calcMap參考initalization你有沒有未來試圖默認構造一個臨時的CTypedPtrMap對象來綁定引用。但是,只有const引用可以綁定到臨時對象。毫無疑問,錯誤消息不是非常豐富。

但即使m_calcMap成員是const refernce,您仍然會遇到將其綁定到臨時問題。在這種情況下,MSVC 2008的編譯器提供了一個非常明確的警告:

mfctest.cpp(72) : warning C4413: '' : reference member is initialized to a temporary 
             that doesn't persist after the constructor exits 
2

除非我錯過了一些東西,因爲它是一個引用,它需要被初始化爲指向某個東西。根據定義,引用變量不能初始化爲NULL。

就int而言,我不知道它爲什麼這麼說。

+0

NULL是一個int,不能轉換爲CCalcMap&。指針可以指向NULL,但引用不能引用NULL。 – 2008-11-06 19:25:18

3

我不確定它從哪裏得到int,但你必須初始化初始化程序列表中的所有引用。 m_calcMap被聲明爲引用,因此它必須被初始化爲引用CCalcMap對象的某個實例 - 您不能將其保留爲未初始化狀態。如果您無法將引用的對象傳遞給構造函數,或者您有可能不需要引用對象,則可以使用指針而不是引用。

0

對於C++編譯器來說,當他們無法弄清楚類型是什麼時,吐出一條錯誤消息並假定用戶意思是'int'以便能夠繼續(...並生成更多的錯誤信息;-)

雖然你確實需要在你的構造函數中初始化類中的所有引用。

0

啊,是我的想法是,我打算來運行其在初始化列表構造,因此具有對象在任何時候都建造。尤其是在Mike B的回覆之後,它現在變得更加清晰了,現在非常有意義的是,構建的對象在超出範圍後會立即被破壞。這是我從來沒有考慮過的第一個。 :S我認爲這對引用是可以的,以及對現有對象的引用進行初始化。