たくさんの.hファイルと.cファイルで構成されるC++の大きなコードに取り組んでいます。
主な問題は、相互にリンクすることになっているクラスのペアによって引き起こされます。ソフトウェアアーキテクチャでの宣言の必要性により、最初のクラス(名前はA)は「上位レベル」のクラスで初期化されます。
だから私たちは次のようなものを手に入れました:
#include A.h
class mainClass{
...
A a;
...
}
ああ、次のようになります。
#ifndef A_H
#define A_H
#include B.h
class A{
A();
fooA();
...
private:
B b;
...
}
#endif
A.cppは次のようになります。
#include B.h
#include A.h
...
A::A(){
...
b(this) //here I get the first error that follows
...
}
A::fooA(){//do somthing}
2番目のクラス(Bとしましょう)に相互ヘッダーが含まれないようにするために、前方宣言とクラスAへのポインター変数を使用しました。
Bhは次のようになります:
#ifndef B_H
#define B_H
class A; //Forward declaration to A
class B{
B()
B(A* const t)
fooB();
A* a; //pointer to A object
}
B.cppは次のようになります。
#include B.h
B::B(){
//default constructor. Do Nothing
}
B::B(A* const t){
this->a=t //constructor that set the pointer to the object of type A
}
B::fooB(){
a->fooA(); //here i get the second error that follows
}
MakefileでBの前にAをリンクすると、コンパイルエラーが発生します。
//First error. See code above for line numbers
error: no match for call to ‘(B) (A* const)’
一方、Aの前にBをリンクすると、コンパイルエラーが発生します。
//Second error. see code above for line numbers
error: invalid use of incomplete type ‘struct A’
_B.h:'line of the forward declaration': error: forward declaration of ‘struct A’
私はC++にかなり慣れていないので、どこが間違っているのか理解できないように管理する必要があります。
編集
今私は解決策を使用しています:
- ガードを含む使用
- クラスAを前方宣言し、BhにAhを含めないでください
- A.cppとB.cppにBhとAhの両方を含めます。常にAhの前にBhを含める
しかし、同じエラーが発生します:
error: no match for call to ‘(B) (A* const)'
コンストラクターのオーバーロードの問題でしょうか?行を削除すると
b(this)
コンパイルは正常に機能します。
解決済み
コンストラクターを使用するのではなく、変数A*aをBに設定するヘルプ関数を使用する場合コンパイル中にすべてが正常に機能します。たぶん、C++でのコンストラクターのオーバーロードをよりよく理解する必要があります。どうもありがとうございます。