当包含在头文件中时,Struct将不起作用

时间:2013-02-21 20:00:03

标签: c++ visual-c++ struct directx header-files

所以我有三个相关文件:

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

Sprite explosion;

所有检查结果。但是当我尝试使用explosion.frame =或explosion-> frame =(或任何其他成员)时,我收到错误“Expression必须是指向完整对象类型的指针。”

如果我在MyDirectX.h中定义整个结构而不是MyDirectX.cpp,我会得到一个未解析的外部符号。如果我在两者中定义,我会得到重新定义错误。

我一直在做测试和研究几个小时,我只是想不出这个。对我来说,为什么结构在MyGame.cpp中起作用但在我的头文件中使用它时不起作用是没有意义的。我应该注意到,我已经在这些文件中声明并定义了许多函数,它们都可以正常工作。

非常感谢任何帮助。  感谢。

3 个答案:

答案 0 :(得分:3)

您需要将struct的完整定义放在标题中,以便可以通过任何完整类型的代码访问它:

struct Sprite
{
  LPDIRECT3DTEXTURE9 texture;

  int frame;
  int starttime;

  Sprite();

};

然后,您可以将实现代码放在单独的.cpp文件中。对于不需要完整类型的代码,您可以继续使用前向声明

struct Sprite;

答案 1 :(得分:2)

Sprite sprite;定义,而不是声明。它试图创建该对象。要声明该类,只需添加struct Sprite;

要拥有全局广告,您需要使用extern Sprite sprite,否则,在多个翻译单元中包含该标题时,您会收到多重定义错误。

答案 2 :(得分:1)

错误“Expression必须是指向完整对象类型的指针”。意味着您只有前向声明的对象,但未提供定义,因此“不完整”。

前瞻声明,即

struct Sprite;

让你:
1)将变量存储/传递为Sprite *
2)将变量存储/传递为Sprite&

您无法执行任何其他操作,即调用函数或访问Sprite的成员。

要做那些你需要定义的东西,即

struct Sprite
{
  LPDIRECT3DTEXTURE9 texture;

  int frame;
  int starttime;

  Sprite();

};

因此,如果另一个.cpp文件正在使用Sprite,则必须将该定义放在标题中,并使用精灵将该标题包含在.cpp中。