4

placeable.h

#include "selectable.h"

class placeable : selectable
{
..
};

選択可能.h

#include "game.h"


class selectable
{
..
};

game.h

#include "placeable.h"

class game
{
...
class placeable* holding;
...
};

基本的に placeable.h は、また placeable.h を含む game.h を含む selectable.h を含みます。

私が考えることができる唯一の解決策は、placeable* を新しいヘッダーに配置して静的/グローバルにし、この新しいヘッダーを game.h と selectable.h に含めることです。

申し訳ありませんが、上部のコードにヘッダー ガードを含めません。私はそれが明らかだと思いました。この場合、継承のためにヘッダーガードは役に立ちません。同じことが前方宣言にも当てはまります。

4

5 に答える 5

5

必要な場合にのみヘッダーを含めます

以下を含めるよりも、前方宣言を使用してください。

Xクラスiffのヘッダーのみを含める必要があります。

  • クラス「X」のメンバーがいます
  • クラス「X」から派生します
  • クラス 'X' のパラメーターを値で渡します。

それ以外の場合は、前方宣言で十分です。

//  -> Don't do this #include "placeable.h"
class     placeable;  // forward declare
                      // Fine if you are using a pointer.

class game
{
    ...
    class placeable* holding;
    ...
};

PS。ヘッダー ガードを追加します。

于 2011-12-23T19:34:11.697 に答える
3

これは、設計の機能を適切にカプセル化していないことを意味します。同じレベルが同じレベルを含むのではなく、より高いレベルがより低いレベルを含む必要があります。ゲームがより高いレベルの場合、選択可能に game.h を含めないでください。

于 2011-12-23T19:30:56.527 に答える
2

これは解決済みの問題です。ヘッダーガードといいます。すべてのヘッダーファイル内でこれを試してください:

#ifndef __NAMEOFTHEFILE_H__
#define __NAMEOFTHEFILE_H__
// nothing goes above the ifndef above

// everything in the file goes here

// nothing comes after the endif below
#endif

また、これを行うこともできます (これは前方参照として知られています)。

// game.h

class placeable;

class game { ...
    placeable* p;
};
于 2011-12-23T19:32:45.867 に答える
0

2 つの問題があります。

  1. 循環ヘッダーの依存関係。解決策 - #ifndef ...
  2. 不明なタイプにスペースを割り当てています。解決策 - クラス配置可能。

詳細はこちら

于 2015-03-30T07:24:47.993 に答える
-1

この問題を回避するには、各ヘッダー ファイルでヘッダー ガードを使用します。一般に、ヘッダー ファイルは次のようになります。

#ifndef PLACEABLE_H
#define PLACEABLE_H

//
// Class definitions and function declarations
//

#endif
于 2011-12-23T19:33:36.417 に答える