错误C2143。为什么VC ++找不到我的课?

时间:2011-01-13 23:08:06

标签: c++ visual-studio visual-studio-2008

我正在一个有几个班级的项目中工作。所有头文件都进入“include”文件夹,所有src文件都进入另一个文件夹。但是在这一点上,缺少一个没有问题的课程。

产生错误的代码是:

namespace render{   
    class CSprite2D
    {   
        CTexture * m_texture;

错误是语法错误:缺少';'在'*'之前 所以我不知道VC ++为什么找不到我的课程。 VC ++编译类的顺序非常疏远:在尝试编译Texture.cpp之前检测sprite2D中的错误。此外,CTexture类已进入项目,并在创建sprite2D之前完美运行。

你可以帮助我找一些找错的技巧吗?

* 编辑: *它有效,解决方案是简单地转发声明纹理类(感谢James和peenut)。但现在我怀疑的是:如果我已经包含纹理,为什么我需要转发声明纹理类?包含头文件是不够的?

提前致谢。

2 个答案:

答案 0 :(得分:2)

只是声明它,你只使用指针:

namespace render{
    class CTexture; //forward declaration  
    class CSprite2D
    {   
        CTexture * m_texture;

当然,正如评论所说:

  • 不要忘记在* .cpp文件中包含所有必需的标题
  • 使用前向声明来分解循环依赖(例如,A类{B * b;}; B类{A * a;})

修改:Asker的编辑:

我已经包含了纹理,为什么我需要转发声明纹理类?

想象一下你有“sprite.hpp”,“texture.hpp”,而CSprite2D包含指向纹理的指针。如果没有前向声明,则必须在包含“sprite.hpp”之前包含“texture.hpp”。更糟糕的是,如果你的CTexture使用指向CSprite2D的指针,你别无选择,只能使用前向声明来避免循环依赖。

答案 1 :(得分:1)

如果代码所在的头文件中没有包含最终包含CTexture定义的任何内容,那么即使其他地方也不知道CTexture是什么。

但是,由于你只是在这里使用指针,你可能只是做一个前向声明并在.cpp文件中包含标题,其中CTexture的方法/数据用于避免循环标题包含。