【问题标题】:error C2143. Why VC++ don't find my class?错误 C2143。为什么 VC++ 找不到我的课程?
【发布时间】:2011-01-13 23:08:05
【问题描述】:

我正在从事一个包含多个课程的项目。所有头文件都在“include”文件夹中,所有 src 文件在另一个文件夹中。但是在这一点上,缺少一个一直没有问题的类。

产生错误的代码是:

namespace render{   
    class CSprite2D
    {   
        CTexture * m_texture;

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

你能帮我找出一些错误吗?

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

提前致谢。

【问题讨论】:

  • 顺序无关紧要,您是否在该代码之前包含了头文件?
  • 你有没有#include-ed 在你需要的地方找到正确的标题?标题相互递归包含有问题吗?

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


【解决方案1】:

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

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

当然,正如 cmets 建议的那样:

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

编辑:提问者的编辑:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-04
      • 2017-06-11
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      相关资源
      最近更新 更多