-1

次のようなものをコンパイルしたいとしましょう:

//Prova.h:
//--------------------
#ifndef _PROVA_
#define _PROVA_

#include "Terza.h"

class Prova{
public:
 Prova();

};
#endif

//Terza.h:
//--------------------
#ifndef _TERZA_
#define _TERZA_

#include "EreProva.h"

class Terza{
public:
  Terza();
};
#endif

//EreProva.h:
//--------------------
#ifndef _EREPROVA_
#define _EREPROVA_

#include "Prova.h"

class EreProva : public Prova{
  public:
  EreProva();
};
#endif

これは、「'Prova' : base class undefined」と言ってコンパイルしません。

継承されたクラス間のヘッダーの再帰を回避する最善の方法は何ですか?

4

3 に答える 3

4

循環的な依存関係が必要な場合は、設計に何か問題があるため、設計を見直して、そのような複雑で不要な循環的な依存関係を削除するようにしてください。

循環依存を克服する方法の 1 つはForward Declarationsを使用することですが、型を前方宣言すると、その型はコンパイラに対してIncomplete 型になり、それで実行できる操作には制限があることに注意してください。コンパイラが型のメモリ レイアウトを認識する必要がある型インスタンスに対して操作を実行することはできません。

よく読んでください:
いつ前方宣言を使用できますか?

于 2012-05-31T14:41:11.443 に答える
0

この種の問題を次のように処理することで回避できる場合があります: (1) ファイルの先頭に "#pragma once" ディレクティブを追加してみてください。 ) (2) クラスにヘッダー ファイルを含める代わりに、「class Prova」またはその他のクラスを追加して、後で定義するが「今すぐ使用」したいクラスを示すことができます。

アルスが言うように、そのようなデザインは避けたほうがいいです。

于 2012-05-31T14:41:01.363 に答える
0

このコードでは:

//Prova.h:
//--------------------
#ifndef _PROVA_
#define _PROVA_

#include "Terza.h"

class Prova{
public:
 Prova();

};

Tezraクラスをまったく使用しないため、 #include. それを取り出す。また、欠落しており、#endif があります。#ifndefこのファイル内の一致するファイルを閉じ#endif ます

さらに:

//Terza.h:
//--------------------
#ifndef _TERZA_
#define _TERZA_

#include "EreProva.h"

class Terza{
public:
  Terza();
};
#endif

#endif

EreProvaまた、このファイルではクラスをまったく使用しないため、#includeステートメントを削除します。#endifまた、ファイルの最後に余分なものがあります。ここには1つ#ifndefしかないので、1つだけのはず#endifです。最後のものを取り出します。

于 2012-05-31T15:01:11.277 に答える