[英]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,
};
};
然后Foo
和Bar
都可以訪問FooEnum::Type
而Bar.h
不需要包含Foo.h
我認為枚舉是一個壞主意,但通常對於常量/很多東西,比如C ++中的常量,其中沒有一個是常量,所有這些都有問題。 我喜歡將它放入一個結構中然后使用它從繼承結構的類。
我也認為pimpl成語很糟糕。 實際上我確信這是一種糟糕的做事方式。 這是有效的,但很尷尬,有點傻。 它也很容易避免,它出現的唯一原因是人們使用其他糟糕的設計選擇。
通常有人會把OOP的東西放到他們設計的混凝土上。 然后你得到混合繼承的情況和它引起的過多問題,比如超慢的編譯時間。 相反,請考慮純虛擬基類,然后將lib寫入其中以避免模板並避免前向聲明問題。 不是一切,但絕對適用於為許多類生成代碼的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.