2010-04-07 127 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,则这不会成为问题,但它会有一点点工作量。