4

クラス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## でも、なぜこれが可能なのでしょうか?

4

1 に答える 1

10

いいえ、それは前方宣言であり、完全な型を定義していません。メンバーをポインターではなくオブジェクトとして保持する場合は、 Bbeforeの完全な定義が必要です。A

この理由の 1 つは、クラスのサイズが に依存するため、クラスのサイズをB知っている必要があるためです。AAB

でお勧めし#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
};
于 2012-05-04T09:49:55.860 に答える