我正在维护一个庞大的代码库,并且正在使用前向声明和pImpl习惯用法的组合来缩短编译时间并减少依赖性(并且它工作得非常好),
我遇到的问题是包含公共枚举的类。这些枚举不能向前声明,所以我没有选择,只能包含类头。例如:
// Foo.h
class Foo
{
public:
enum Type
{
TYPE_A,
TYPE_B,
};
...
};
// Bar.h
#include "Foo.h" // For Foo::Type
class Bar
{
public:
void someFunction(Foo::Type type);
...
};
所以,我正在寻找避免这种情况的方法,只能想到以下几点:
将类枚举移动到单独的“类型”命名空间
// FooTypes.h
namespace FooTypes
{
enum Type
{
TYPE_A,
TYPE_B,
};
}
// Bar.h
#include "FooTypes.h"
class Bar
{
public:
void someFunction(FooTypes::Type type);
...
};
使用int而不是枚举
// Bar.h
class Bar
{
public:
void someFunction(int type);
...
};
我错过了什么?其他人如何解决这个限制(无法转发声明枚举。)
答案 0 :(得分:3)
将枚举放在包含PIMPL的类中。
答案 1 :(得分:2)
将枚举放入自己的类型:
struct FooEnum
{
enum Type
{
TYPE_A,
TYPE_B,
};
};
然后Foo
和Bar
访问FooEnum::Type
和Bar.h
都不需要包含Foo.h
。
答案 2 :(得分:0)
我认为枚举是一个坏主意,但通常对于常量/很多东西,比如C ++中的常量,其中没有一个是常量,所有这些都有问题。我喜欢将它放入一个结构中然后使用它继承结构的类。
我也认为pimpl成语很糟糕。实际上我确信这是一种糟糕的做事方式。这是有效的,但很尴尬,有点傻。它也很容易避免,它出现的唯一原因是人们使用其他糟糕的设计选择。
通常有人会把OOP的东西放到他们设计的具体的课程上。然后你得到混合继承的情况和它引起的过多问题,比如超慢的编译时间。相反,请考虑纯虚拟基类,然后将lib写入其中以避免模板并避免前向声明问题。不是一切,但绝对适用于为许多类生成代码的情况。