web-dev-qa-db-ja.com

エラー:不完全な型へのメンバーアクセス:の前方宣言

同じ.cppファイルに2つのクラスがあります。

// forward
class B;

class A {       
   void doSomething(B * b) {
      b->add();
   }
};

class B {
   void add() {
      ...
   }
};

フォワードは機能せず、コンパイルできません。

私はこのエラーを受け取ります:

error: member access into incomplete type 'B'
note: forward declaration of 'B'

私はclangコンパイラ(clang-500.2.79)を使用しています。

複数のファイル(.cppと.hh)を使用したくないので、1つの.cppのみにコーディングしたい

クラスAの前にクラスBを書くことはできません

私の問題を解決する方法についてのアイデアはありますか?

35
LOLKFC

doSomething定義をそのクラス宣言の外でBの後に移動し、addA- ingまたはpublic-することでfriendにアクセスできるようにしますそれをする。

class B;

class A
{
    void doSomething(B * b);
};

class B
{
public:
    void add() {}
};

void A::doSomething(B * b)
{
    b->add();
}
27
deepmax

クラスを使用する前に、クラスBの-​​definitionが必要です。それ以外の場合、コンパイラはB::addなどの関数が存在することをどのように知るでしょうか?

クラスBをクラスAの前に定義するか、クラスBが定義された後にA::doSomethingの本体を移動します

class B;

class A
{
    B* b;

    void doSomething();
};

class B
{
    A* a;

    void add() {}
};

void A::doSomething()
{
    b->add();
}