枚举“复制”问题

时间:2010-04-07 22:49:43

标签: c++ decorator enums typedef

我有一个类,我们称之为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;

是最好的决定吗?这是合法的吗?

2 个答案:

答案 0 :(得分:1)

typedef的问题在于它不会使A消失。你不能说F f = B::ONE;,因为B :: ONE不存在。你仍然需要使用A :: ONE等。根据我的理解,这不是你想要的。

对于你想要的东西,在B中创建一个新的枚举可能是你最好的选择。这里唯一需要注意的是1)你需要在A :: E和B :: F之间输入强制转换,2)一个枚举中的变化需要在另一个枚举中进行镜像。

尽管如此,没有必要按照您的方式复制值。如果A :: E是:

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。如果你按照你所展示的方式定义B :: F(ONE = A :: ONE ......),这不会是一个问题,但它会更多的工作。

答案 1 :(得分:0)

我认为为了提高程序的简洁性,你提出的两个选择中更好的是使用typedef,除非有一些令人信服的理由不这样做。我当然不建议复制功能(因为你的第一种方法似乎正在做)因为这很快成为维护问题。