我有一个类,我们称它为 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;
是最好的决定吗?合法吗?
最佳答案
typedef 的问题在于它不会让 A 消失。你不能说 F f = B::ONE;
,因为 B::ONE 不存在。您仍然必须使用 A::ONE 等。据我了解,这不是您想要的。
就您的目标而言,在 B 中创建一个新的枚举可能是您最好的选择。此处唯一需要注意的是 1) 您需要在 A::E 和 B::F 之间进行类型转换,以及 2) 一个枚举中的更改需要反射(reflect)到另一个枚举中。
不过,没有必要像您那样复制值。如果 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 ... ),这将不是问题,但工作量会增加一些。
关于c++ - 枚举 "copy"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596446/