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

Tim*_*upe 9 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;
};
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Coi*_*oin 8

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

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

  • 你可以转发声明typedef完全违背使用a的目的typedef.
  • 您包含要包含的文件typedef,您要避免使用该文件.

更有趣的解决方案:

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

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

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