2012-05-04 107 views
3

我試着做A類B類的朋友不完全類型錯誤

class B; 

class A{ 
public: 
void show(const B&); // ##1## but this one works fine 
B ob;// error incomplete type 

}; 


class B{ 
public: 
int b; 
B():b(1){} 
friend class A; 

}; 

所以我的問題是,爲什麼它是不完整的類型?我認爲,當我做了class B這就像一個函數的原型,它告訴編譯代碼中的某個地方有一個定義。

也在## 1 ##上面的代碼中爲什麼這是可能的?

+0

相反,你可以有成員作爲指針B(B * OB) – maress

回答

9

不,這是前向聲明,沒有定義完整類型。如果要將成員保留爲對象而不是指針,則需要在A之前對B有完整的定義。

其中一個原因是由於A的尺寸取決於B,因此必須知道類B的尺寸爲A

我建議你#include "B.h"A.h

編輯:澄清:

struct A; 

struct B 
{ 
    A foo(); 
    void foo(A); 
    void foo(A&); 
    void foo(A*); 

    A* _a; 
    A& __a; 
    A a; // <--- only error here 
}; 
+0

1)怎麼樣無效秀(常量B&)爲什麼這個工程。 – AlexDan

+1

值得注意的是,引用是好的,因爲你不需要知道類型的細節來引用它。 – Flexo

+0

@AlexDan引用和指針不需要知道任何關於聲明中的類,除了它存在。 –