2009-11-16 31 views
0

我與傳統類,看起來像這樣的工作:使用C++中的命名空間將枚舉類與類定義分開?

class A 
{ 
    enum Flags { One = 1, Two = 2 }; 
}; 

我想所有的枚舉拉出到一個新的頭文件中定義一個新的命名空間:

// flags.h 

namespace flags { 

enum Flags { One = 1, Two = 2 }; 

}; 

然後拉這些枚舉回類,這樣我可以只包括在標題中的flags.h只需要這些值(而不是整個類定義):

// a.h 

#include "flags.h" 

class A 
{ 
    using namespace flags; 
}; 

我應該怎麼做?

+1

你能澄清什麼呢和不爲你工作,你想怎麼使用,在代碼?爲什麼不把枚舉放入超類? – 2009-11-16 12:59:53

回答

2

使用指令在類範圍內是非法的。相反,一個命名空間可以定義一個類,然後從它繼承:

struct flags { 
    enum Flags { One=1, Two=2 }; 
}; 

class A : public flags { ... }; 

但這樣子繼承的濫用給我,說實話。作爲替代,你可以硬着頭皮使用命名空間沒有「進口」的名字變成A類

+2

咬住子彈是最好的選擇,儘管我仍然更喜歡'struct'封裝,即'namespace'一個,因爲struct以一種命名空間的方式與模板進行交互。 – 2009-11-16 13:10:47

+0

結構風格命名空間怎樣才能成爲模板的優勢?正如所看到的,結構只是允許你用兩種方法來做同樣的事情。來自struct命名空間或枚舉類型的模板。而更加標準的命名空間使用只允許使用一個。編寫perl時只需要更多的方法來做同樣的事情。 – 2009-11-16 16:30:50

0
class F { 
    enum Flags { One = 1, Two = 2 }; 
}; 


class A : public F { 
}; 
+0

發現遺傳濫用......你能否至少給出F'protected'的構造函數和析構函數? – 2009-11-16 13:09:54

1

你不能讓他們都在一個類中可見,但不通過using聲明中seperately拉動值。

在我看來,你可以做的最好的事情就是將它們包裝在一個不包含其他內容的類中。這樣,你可以讓他們在另一大類可見從類派生是持有的枚舉:

struct Holder { 
    enum E { a }; 
protected: 
    Holder() {} 
    ~Holder() {} 
}; 

class User : public Holder 
{ 
public: 
    void f() { /* a is visible here */ } 
}; 

void f() { /* User::a is visible here */ } 
+0

發現繼承的誤用......你能否至少給出F'protected'的構造函數和析構函數? – 2009-11-16 13:15:54

+0

你的意思是持有人?採取的點。 – 2009-11-16 13:30:04