簡體   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