3

だから私は3つの関連ファイルを持っています:

MyGame.cpp        //Where all my codeing takes place
MyDirectX.h       //Where I declare prototypes
MyDirectX.cpp     //where I define functions/structs 

次のような小さな構造体があります。

struct Sprite
{
LPDIRECT3DTEXTURE9 texture;

int frame;
int starttime;

    Sprite()
    {
        texture = NULL;
        texture = LoadTexture("explosion_30_128.tga");
        frame = 0;
        starttime = 0;
    }
};

だからここに問題があります:

MyGame.cpp で宣言すると、構造体は問題なく動作します。ただし、他の関数がそれに依存しているため (および整頓のために)、ヘッダー ファイルに必要です。MyDirectX.h で次のように宣言します。

struct Sprite;

MyDirectX.cpp で定義します。

struct Sprite
{...code...};

MyGame.cpp でグローバル スプライトを作成できます

Sprite explosion;

そして、すべてチェックアウトします。しかし、explosion.frame = または development->frame = (またはその他のメンバー) を実行しようとすると、「式は完全なオブジェクト型へのポインターである必要があります」というエラーが表示されます。

MyDirectX.cpp ではなく MyDirectX.h で構造体全体を定義すると、未解決の外部シンボルが取得されます。両方で定義すると、再定義エラーが発生します。

私は何時間もテストと調査を行ってきましたが、これを理解することはできません. 構造体が MyGame.cpp で機能するのに、ヘッダー ファイルで使用すると機能しない理由がわかりません。これらのファイルで多くの関数を宣言および定義しましたが、それらはすべて問題なく動作することに注意してください。

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

3

の完全な定義をstructヘッダーに入れて、完全なタイプのコードからアクセスできるようにする必要があります。

struct Sprite
{
  LPDIRECT3DTEXTURE9 texture;

  int frame;
  int starttime;

  Sprite();

};

その後、実装コードを別のファイルに入れることができ.cppます。完全な型を必要としないコードの場合は、引き続き前方宣言を使用できます

struct Sprite;
于 2013-02-21T20:02:18.537 に答える
3

Sprite sprite;宣言ではなく、定義です。そのオブジェクトを作成しようとします。クラスを宣言するには、 を追加するだけstruct Sprite;です。

グローバルにするには、 を使用する必要がありますextern Sprite sprite。そうしないと、そのヘッダーを複数の翻訳単位に含めると、複数の定義エラーが発生します。

于 2013-02-21T20:01:59.843 に答える
2

エラー「式は完全なオブジェクト型へのポインタである必要があります。」これは、オブジェクトを前方宣言しただけで、定義を提供していないため、「不完全」であることを意味します。

前方宣言、すなわち

struct Sprite;

1)変数をスプライトとして保存/渡す
*
2)変数をスプライトとして保存/渡す&

関数を呼び出したり、Spriteのメンバーにアクセスしたりするなど、他に何もできません。

これらのことを行うには、定義が必要です。

struct Sprite
{
  LPDIRECT3DTEXTURE9 texture;

  int frame;
  int starttime;

  Sprite();

};

したがって、別の.cppファイルがスプライトを使用している場合は、定義をヘッダーに入れ、そのヘッダーをスプライトを使用して.cppに含める必要があります。

于 2013-02-21T23:26:37.520 に答える