2012-07-02 52 views
6

我編譯如下代碼:不完全型嵌套名指定命名

class B; 

class A { 
    A(); 
    friend A B::newAObject(); 
}; 

class B { 
    friend A::A(); 
public: 
    A newAObject(); 
}; 

這似乎很奇怪,但這個想法是有一個類A,只能通過B類型的對象產生(誰可能會是一個單身人士)。

問題是我創建了這些對象之間的循環依賴關係。 A必須在B之前定義,而B必須在A之前定義。顯然,前向聲明B不夠好,B實際上必須在A之前完全定義(反之亦然)。

我該如何解決這個問題?

編輯:實際的錯誤是:在嵌套名稱說明符中命名的不完整類型'B'。

注意:還有另一個類似於這裏的帖子:Error: incomplete type used in nested name specifier,但它很重要的模板化,這讓我困惑,因此這篇文章。

+1

使單一方法成爲朋友有點奇怪。你確定你不想讓全班同學成爲朋友嗎? –

+0

我不知道這是可能的。它是如何完成的?我只是在'A'裏寫'朋友類B'而在'B'裏寫'朋友類A'? – anthropomorphic

+1

這是正確的... –

回答

5

C++ 2003規定,當訪問類的內容時,應該完全定義這個類。前向宣言是不夠的。這意味着像你一樣的循環依賴是不允許的。

p.s.如果這就是你所需要的,那麼宣佈整個班級成爲朋友應該可以工作。

順便說一句,朋友規格產生向前聲明的類,看看下面的代碼:

void F10(C1 &p1); 

class C2 
{ 
    friend class C1; 
}; 

void F11(C1 **p1); 

編譯器會給出語法錯誤F10因爲C1是不確定的,但F11將編譯因爲細朋友規格。這可能聽起來很奇怪,但這是在標準中定義的,編譯器會遵循這一點。

+0

將這兩個類聲明爲另一個的朋友爲我工作。謝謝。 – anthropomorphic