0

たくさんの.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++にかなり慣れていないので、どこが間違っているのか理解できないように管理する必要があります。

編集

今私は解決策を使用しています:

  1. ガードを含む使用
  2. クラスAを前方宣言し、BhにAhを含めないでください
  3. A.cppとB.cppにBhとAhの両方を含めます。常にAhの前にBhを含める

しかし、同じエラーが発生します:

error: no match for call to ‘(B) (A* const)'

コンストラクターのオーバーロードの問題でしょうか?行を削除すると

b(this)

コンパイルは正常に機能します。

解決済み

コンストラクターを使用するのではなく、変数A*aをBに設定するヘルプ関数を使用する場合コンパイル中にすべてが正常に機能します。たぶん、C++でのコンストラクターのオーバーロードをよりよく理解する必要があります。どうもありがとうございます。

4

3 に答える 3

0

B.cppの「Ah」を入れてみてください!

これにより、B.cppのAを使用する必要がある場合に、「A」タイプが解決されます。何もしないことを確認してください。ただし、Bh内からAへのポインター/参照を保持し、B.cpp内からAを使用してすべての実際の作業を行ってください。

于 2013-02-14T15:32:46.037 に答える
0

まず第一に、「us2012」のアイデアに従って、インクルード ガードを使用してください。

次に、前方宣言を変更します。

あ:

#ifndef A_H
#define A_H
class B;
class A{
   A();
   fooA();
   ...
private:
   B b;
   ...   
}
#endif

および A.cpp に Bh を含める

Bh では、もう一度 Ah をインクルードしますが、インクルード ガードはエラーを防ぐ必要があります。

#ifndef B_H
#define B_H

#include "A.h"
class B{
  B()
  B(A* const t)
  fooB();
  A* a;   //pointer to A object
}
#endif

私はそれをテストしていません...しかし、うまくいくはずです。

于 2013-02-14T15:43:37.970 に答える
0
  1. インクルードガードを使用する
  2. クラス A を前方宣言し、Bh に Ah を含めない
  3. A.cpp と B.cpp に Bh と Ah の両方を含めます。Ah の前には常に Bh を含めます
于 2013-02-14T16:01:23.763 に答える