9

我试图通过使用前向声明并将#includes移动到实现文件中来简化一堆头文件“包括意大利面条”。但是,我不断遇到以下情况:

//Foo.h
#include "Bar.h"

class Foo
{
public:
  void someMethod(Bar::someType_t &val);
};

//Bar.h
.
.
.
class Bar
{
public:
  typedef std::vector<SomeClass> someType_t;
};

我想在尽可能多的情况下删除#include "Bar.h"。我还看到 Bar.h 中的 typedef 列在 Bar 类之外的情况。我假设这两种情况都可以以相同的方式解决。

有任何想法吗?

4

2 回答 2

8

不幸的是,您没有太多选择,而且没有一个是完美的。

首先,两个明显且不可接受的解决方案:

  • 您可以转发声明,typedef这完全违背了使用 a 的目的typedef
  • 您包括包含 的文件typedef,这是您要避免的。

更有趣的解决方案:

  • 将所有相关typedef的 s 包含在同一个文件中并包含该文件。但是,这会在类之间创建代码耦合。您应该只对相关类执行此操作,否则您最终会得到一个上帝包含文件,当您typedef向该文件添加一个时,这可能会导致大量重新编译。
  • 对于每个类,都有一个单独的包含,其中包含typedefs。有点烦人,但它有效。

最后两个类似于进行前向声明,但添加了typedefs。它们减少了文件的相互依赖性,因为您很少修改 typedef 文件。

我想说在大多数情况下,中央包含最有利于麻烦。小心点。

于 2009-05-07T19:41:15.527 回答
-2

只需使用class Bar;. 这告诉 C++ 你正在声明你打算定义 Bar。

于 2009-05-07T19:35:10.207 回答