【问题标题】:Avoiding classes not seeing one another? C++避免上课不见面? C++
【发布时间】:2012-02-28 06:20:15
【问题描述】:

我刚刚进入了一个建立项目的链接地狱。我在我的头文件中移动了一些东西,现在我遇到了这样一个事实,尽管我在每个头文件上都使用了#indef、#define 和#endif,但有些对象看不到其他对象。

我注意到在我的一个旧文件中,我在一个名为 World 的类中使用了一个名为 Region 的类。

因为类 World 一直抱怨看不到其他类,我可以通过简单地包含类 Region 来解决它;在它上面。

有什么办法可以避免这样的事情吗?

谢谢。

【问题讨论】:

  • 我们需要查看代码和错误信息。有了这么模糊的描述,有很多事情可能是问题的根源。
  • 对于这个一般性的问题,我们可能无法帮助您。你的意思是你包含了标题(#include "Region.h")还是你声明了类(class Region;)?
  • 您(模糊地)描述的问题听起来更像是编译错误而不是链接器错误(特别是如果它们通过添加#include 指令来解决)。另外,我希望您的意思是“#ifdef”而不是“#indef”。
  • 所有的 .cpp 都编译成 .o 文件了吗?

标签: c++ header linker


【解决方案1】:

我避免包含/依赖问题的一种方法是尝试尽可能少地声明类/结构定义(但仅限指针/引用,感谢 Aldo 指出这一点)。假设你有这个课程:

class foo
{
    bar* barObject;
};

显然 bar 需要在之前的某个时间点定义。除了包含 bar 的头文件,我们可以简单地在 foo 的定义之前添加以下行。

class bar;

这可以防止编译器抱怨 bar 未定义,但也不需要包含整个标头。 (称为前向声明)

我发现这可以最大限度地减少很多在存在循环依赖等问题时可能出现的讨厌的包含问题。

这可能对您的情况有所帮助,也可能无济于事,因为根据您提供的信息很难诊断您的具体问题,但它可以提供一个起点。

更多阅读: http://www-subatech.in2p3.fr/~photons/subatech/soft/carnac/CPP-INC-1.shtml

【讨论】:

  • 前向声明(所谓的)在您使用的示例中实际上不起作用。如果类 foo 包含一个指针或对 bar 的引用,它会起作用,但如果它包含按值的 bar 则不会 - 在这种情况下,编译器需要 bar 的完整声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多