2012-05-04 28 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にお送りします。

EDIT:明確化:

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)どのような空のショーについて(のconst B&)この作業の理由。 – AlexDan

+1

参照のために型の詳細を知る必要がないため、参照が適切であることに注意してください。 – Flexo

+0

@AlexDanの参照とポインタは、存在する以外の宣言内のクラスについて何も知る必要はありません。 –

関連する問題