2012-09-05 114 views
3

有一个现有枚举地图一个枚举另一个枚举

typedef enum 
{ 
    myEnum_front = 11, 
    myEnum_back = 19 
} myEnumSides; 

我想创建另一个枚举new_myEnumSides,它的价值应该被映射到为myEnumSides值。因此,我会使用new_myEnumSides而不是myEnumSides。 为此目的,代码是否正确?

typedef enum 
{ 
    new_myEnum_front = myEnumSides::myEnum_front, 
    new_myEnum_back = myEnumSides::myEnum_back 
} new_myEnumSides; 

或者还有更好的方法吗?

+3

我能问你为什么要这样做吗? – Aesthete

+0

新的枚举将用于可能会暴露给客户的层中。 – ontherocks

+1

看起来没问题,只是'typedef'语法是不必要的:'enum myEnumSides {....};'。另外,'::'语法只适用于C++ 11类的枚举。令人讨厌的C++ 03枚举值生活在全局命名空间中。 – juanchopanza

回答

1

我不可能想象为什么你需要做...如果你不需要重命名枚举的值,你可以做第一个的另一个变量,无需添加其他枚举(我相信这不是你的情况,但还是要指出这个机会):

typedef enum 
{ 
    myEnum_front = 11, 
    myEnum_back = 19 
} myEnumSides, new_myEnumSides;//<-- just add the new variable here 

如果想重新命名它(我相信,你的情况下),你应该不是使用::运营商,而只是写:

typedef enum 
{ 
    myEnum_front = 11, 
    myEnum_back = 19 
} myEnumSides; 

typedef enum 
{ 
    new_myEnum_front = myEnum_front, 
    new_myEnum_back = myEnum_back 
} new_myEnumSides; 

::经营者应使用只有当枚举是一个类,结构或命名空间内,否则不需要::

+0

第一个示例具有误导性,因为它不会将一个枚举值赋给另一个枚举值。它为相同的无名枚举创建两个typedef。 – juanchopanza

+0

@娟,编辑答案使其更加清晰 – SingerOfTheFall

0

我可以想象你想要这样做的唯一原因是扩展现有enum并创建一个具有额外值的新的。

由于enum不提供任何形式的继承,是编译时间常数和真的只是整数,您可以这样的事情,虽然我不特别推荐它..

// internalEnums.h 
myEnum_front = 11, 
myEnum_back = 19 

// customerEnums.h 
someNewValue = 20, 
someOtherNewValue = 21 

// Wherever you want to define your enums 
typedef enum 
{ 
    #include "customerEnums.h" 
} customerAccessible; 

typedef enum 
{ 
    #include "internalEnums.h" 
    #include "customerEnums.h" 
} internalUseOnly; 

// Now there are two enumerations, sharing items. 
customerAccessible::someNewValue // 11 
customerAccessible::myEnum_front; // Doesn't exist 

编辑根据您的评论,您可以通过将值保存在专门用于外部使用的标头中来向客户公开枚举。

相关问题