同じ.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を書くことはできません
私の問題を解決する方法についてのアイデアはありますか?
doSomething
定義をそのクラス宣言の外でB
の後に移動し、add
をA
- ingまたはpublic
-することでfriend
にアクセスできるようにしますそれをする。
class B;
class A
{
void doSomething(B * b);
};
class B
{
public:
void add() {}
};
void A::doSomething(B * b)
{
b->add();
}
クラスを使用する前に、クラス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();
}