在 C++ 中转发声明类的公共 typedef
-
08-07-2019 - |
题
我试图通过使用前向声明并将 #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 类之外的情况。我假设这两种情况都可以用相同的方式解决。
有任何想法吗?
解决方案
不幸的是,您没有太多选择,而且没有一个是完美的。
首先,两个明显且不可接受的解决方案:
- 您可以转发声明
typedef
这完全违背了使用的目的typedef
. - 您包含的文件包含
typedef
, ,您想要避免的情况。
更有趣的解决方案:
- 相关的都有
typedef
s 在同一个包含文件中并包含该文件。但这会在类之间创建代码耦合。你应该只对相关的类这样做,否则你最终会得到一个上帝包含文件,当你添加一个时,这可能会导致大量的重新编译typedef
到该文件。 - 对于每个类,都有一个单独的包含
typedef
就在里面。有点烦人,但它有效。
最后两个就像进行前向声明,但添加了 typedef
s。它们减少了文件的相互依赖性,因为您很少修改 typedef 文件。
我想说,在大多数情况下,中央包含最有利于避免麻烦。请小心。
其他提示
只需使用 class Bar;
。这告诉C ++你宣布你有意定义Bar。
不隶属于 StackOverflow