所以我有三个相关文件:
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中起作用但在我的头文件中使用它时不起作用是没有意义的。我应该注意到,我已经在这些文件中声明并定义了许多函数,它们都可以正常工作。
非常感谢任何帮助。 感谢。
答案 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中。