繁体   English   中英

前向声明的类枚举问题的变通方法?

[英]Workarounds for the forward-declared class enumeration problem?

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

我错过了什么? 其他人如何解决这个限制(无法转发声明枚举。)

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

将枚举放入自己的类型:

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

然后FooBar都可以访问FooEnum::TypeBar.h不需要包含Foo.h

我认为枚举是一个坏主意,但通常对于常量/很多东西,比如C ++中的常量,其中没有一个是常量,所有这些都有问题。 我喜欢将它放入一个结构中然后使用它从继承结构的类。

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

通常有人会把OOP的东西放到他们设计的混凝土上。 然后你得到混合继承的情况和它引起的过多问题,比如超慢的编译时间。 相反,请考虑纯虚拟基类,然后将lib写入其中以避免模板并避免前向声明问题。 不是一切,但绝对适用于为许多类生成代码的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM