2014-04-08 37 views
-1

我曾嘗試在方法聲明中使用構造函數作爲默認值,就像這樣:我可以使用構造函數或對象作爲其他類方法的參數默認值嗎?

A.hpp

#include "B.hpp" 
class B; 
Class A { 
friend class B; 
    public: 
    A(); 
    ~A(); 
    const A& operator = (const A& rhs) { 
     // assignment operations 
     return *this; 
    } 
    int do_something (B* pB); 
}; 

B.hpp

#include "A.hpp" 
class B { 
    public: 
    B(const A a = A()); 
    ~B(); 
}; 

我的GCC 4.8 C + +11編譯器不滿意該行B(const A a = A());

error: 'A' does not name a type error: ISO C++ forbids declaration of 'A' with no type [-fpermissive]

我需要一個默認值,我不想使用像B(A *a = NULL, int z = 0);這樣的指針。

我也試圖聲明靜態元素,並使用該對象的默認值:

A.hpp

#include "B.hpp" 
class B; 
class A { 
    // ... 
}; 

B.hpp

#include "A.hpp" 
A a0; 
class B { 
    public: 
    B(const A a = a0); 
    ~B(); 
}; 

我得到完全同樣的錯誤。

我該如何做到這一點?

編輯:使代碼更接近真實的代碼。

+1

這是你的真實密碼?類定義之後沒有分號。 – jrok

+0

對不起,我在寫這個例子時錯過了。原來的代碼是正確的。所以,最初的問題仍然是一樣的。 – lalebarde

+2

沒有足夠的信息,因爲它是。 [SSCCE](http://sscce.org)在這裏很有用。 – jrok

回答

1

我終於找到了問題的根源,它壞使用的#include所致。

在A.hpp中刪除行#include "B.hpp"解決了這個問題。 A頭只需要B類的前向聲明,因爲它只使用指向這個類的指針。我得出結論,我有一個循環的頭參考。我認爲使用friend需要包含類的頭部。注意:B類實際上需要訪問A類的一些私人成員。

對不起,我的不好的初始文章,它是不可能診斷任何東西,因爲它不是真正的足夠接近(coorected)。下次我會堅持參加SSCCE。感謝大家。正如該夥伴的結論here,「這真的很愚蠢」。然後我發現了詳細的解釋herehere

4

你必須在你的類的大括號後面加上分號。

class A  class A 
{    { 

} /* bad */ }; /* good */ 
1

移動靜態變量聲明a0 A類的定義之後,就像這樣:

class A 
{ 
    // class definition 
}; 

A a0; 

class B 
{ 
    B (const A a = a0); 
}; 
+0

類聲明位於標頭中,所以它是正確的。 – lalebarde

+0

我不明白什麼是正確的手段。當編譯器讀取行'A a0'時,如果標識符'A'到那時還沒有被聲明爲類,編譯器將會發出錯誤。 –

+0

好的,我重新編輯更清晰,對不起。 – lalebarde

相關問題