2010-04-07 141 views
2

我有一個類,我們稱它爲A.它有一個枚舉(E)和一個方法Foo(E e),並在參數中獲取E.我想爲A寫一個包裝器(裝飾器)W,所以它會有自己的方法Foo(A :: E)。但是我想要進行某種封裝,所以這個方法應該定義爲Foo(F f),其中F是W中定義的另一個枚舉,可以轉換爲A :: E。例如:枚舉「複製」問題

class A 
{ 
    public: 
    enum E { ONE, TWO, THREE }; 
    void Foo(E e); 
}; 

class B 
{ 
    //enum F; // ??? 
    void Foo(F f) 
    { 
    a_.Foo(f); 
    } 

    private: 
    A a_; 
}; 

應該如何定義F?我不想複製這樣的值:

enum F { ONE = A::ONE, TWO = A::TWO, THREE = A::THREE }; 

因爲它在附近的一個潛在的錯誤功能。是typedef的定義:

typedef A::E F; 

是最好的決定嗎?它合法嗎?

+0

typedef本質上會使用B中的A :: E。所以我想明顯的問題是爲什麼你不想在這兩個類中使用A :: E,那就是聲明B :: Foo(A: :E f)? – andand 2010-04-08 01:33:18

回答

0

我認爲爲了提高程序的簡單性,您提出的兩個選擇中的更好的方法是使用typedef,除非有一些令人信服的理由不要。我當然不建議重複功能(因爲你的第一種方法似乎在做),因爲這很快成爲維護問題。

1

typedef的問題是它不會讓A消失。你不能說F f = B::ONE;,因爲B :: ONE不存在。你仍然必須使用A :: ONE等。據我所知,這不是你想要的。

對於看起來像你要做的事情,在B中創建一個新的枚舉可能是你最好的選擇。這裏唯一需要注意的是1)你需要在A :: E和B :: F之間輸入類型,2)一個枚舉中的變化需要在另一個枚舉中鏡像。

儘管如此,您不需要複製這些值。如果A ::電子商務是:

enum E { ONE = 4, TWO = 7, THREE, FOUR, FIVE }; 

然後,您可以複製並粘貼此創建B :: F:

enum F { ONE = 4, TWO = 7, THREE, FOUR, FIVE }; 

然而,這個副本的缺點&糊的是,如果我再決定要將A :: TWO更改爲等於10,我必須確保更改B :: TWO。如果您按照您展示的方式(ONE = A :: ONE ...)定義B :: F,則這不會成爲問題,但它會有一點點工作量。