4

我正在维护一个大型代码库,并且正在使用前向声明和 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);
  ...
};

我错过了什么?其他人如何绕过这个限制(不能转发声明枚举。)

4

3 回答 3

3

将枚举放入包含 PIMPL 的类中。

于 2009-12-07T18:14:33.510 回答
2

将枚举放入自己的类型:

struct FooEnum
{
  enum Type
  {
    TYPE_A,
    TYPE_B,
  };
};

然后FooandBar既可以访问FooEnum::Type也不Bar.h需要包含Foo.h.

于 2009-12-07T18:32:24.873 回答
0

我认为枚举一开始是个坏主意,但通常对于常量/C++ 中的常量之类的许多东西都不是常量,而且所有这些都有问题。我喜欢将它放入一个结构中,然后让使用它的类从该结构继承。

我还认为 pimpl 成语很糟糕。实际上,我确信这是一种糟糕的做事方式。这是可行的,但很尴尬而且有点愚蠢。它也很容易避免,唯一的原因是人们使用了其他糟糕的设计选择。

通常有人只是将 OOP 的东西添加到他们设计为具体的类中。然后你会得到混合继承的情况以及它导致的大量问题,例如编译时间超慢。相反,请考虑纯虚拟基类,然后将您的库写入其中以避免模板并避免前向声明问题。并非适用于所有情况,但绝对适用于为大量类生成代码的情况。

于 2009-12-08T01:12:54.123 回答