Forward在c ++中声明一个类的public typedef

时间:2009-05-07 19:28:05

标签: c++ typedef forward-declaration

我正在尝试通过使用前向声明并将#includes移动到实现文件中来简化一堆头文件“include spaghetti”。但是,我继续发生以下情况:

//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类之外的情况。我假设两种情况都可以用同样的方式解决。

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

不幸的是,你没有很多选择,没有一个是完美的。

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

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

更有趣的解决方案:

  • 将所有相关的typedef包含在同一个包含中并包含该文件。这会创建类之间的代码耦合。你应该只用相关的类来做到这一点,否则你最终会得到一个神包含文件,当你向该文件添加typedef时,这可能导致大量的重新编译。
  • 对于每个班级,都有一个单独的包含typedef的内容。有点讨厌,但它确实有效。

最后两个就像做前向声明但添加了typedef s。它们减少了文件的相互依赖性,因为您很少修改typedef文件。

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

答案 1 :(得分:-2)

只需使用class Bar;即可。这告诉C ++你宣布你有意定义Bar。