枚举数组相对于常量和宏的优势



可能重复:
我应该使用#define、enum还是const
#defines与常量的优缺点?

枚举将如何比#define和const更有用。内存和代码的可视性和可读性。如果我已经取了integer中的所有值,我可以将(类型cast)enum转换为int的数组吗。

示例:

    class MapPlt_clContainer { 
    public:  
    enum tagVectorType {       
    enVTAll = 0,       
    enVTPolygon,       
    enVTLines 
    }  
    };  
    tVoid MapPlt_clRender::vDrawLineClass( MapPlt_clContainer::tagVectorType* ) 

调用函数枚举时通过

vDrawLineClass( ClassArray_Group ); //Working

调用数组基址时通过

int test[3] =  
{       
5,       
6,       
7, 
};   
vDrawLineClass( test); //Not Working

错误!!

它应该自动进行类型转换吗?或者它依赖于编译器。就我而言,这是一个错误。

enum是一个独立的类型,与#define不同,该语言(在编译器的帮助下)将帮助您确保不会混合不同类别的值(即使它们具有相同的数值)。

此外,enum的值可用于调试器,而#define的原始含义在预处理时间期间(甚至在代码生成开始之前)丢失。

enum类型转换为int是一个自动的内置过程,而相反的转换则更为棘手,因为并非所有的int值都适用于特定的enum

如果您在没有default子句的switch语句中使用了所有可能的enum的值,则现代编译器也会警告您,这是无法检查#define的的

如果在C++中使用枚举作为整数,则会有气味。枚举定义一个类型,并且只应使用该类型的值。(我意识到这是不强制的,枚举可以被解释为int,但使用C++通常不应该这样)。

另外,我的一个大毛病是:不要在C++中的枚举名称中加"Type"。枚举的值不是"类型"(在C++的意义上)。一旦开始编写模板代码,就会讨厌所有类型名称中包含"类型"一词的枚举。

此外,任何时候你试图在你的设计中打字,你都做错了。这在C++中是一股难闻的气味。你不应该这样做,当然也不应该把它设计到你的代码中(也就是说,把它当作一个"特性")。

最后,这部分:

int test[3] =  
{       
5,       
6,       
7, 
}; 
vDrawLineClass( test); //Not Working

这是一个直接丑陋的黑客。说到做到:

MapPlt_clContainer::tagVectorType test[3] =  
{       
MapPlt_clContainer::enVTAll,       
MapPlt_clContainer::enVTPolygon,       
MapPlt_clContainer::enVTLines 
};
vDrawLineClass( test);

除了其他答案中的要点外,我想添加以下内容:

如果你有多个类型,并且你需要对它们进行迭代,你将不得不使用一个常量数组,它将是这样的:

const int states[] = {STATE_1,STATE_2, STATE_3, STATE_4 };
int numStates = sizeof(states)/sizeof(state[0]);
for (int i = 0; i < numStates; i++) {
    // Do something with states[i]..
}

通过枚举,这可以简化为

enum states{cState_1 = 0, cState_2, cState_3, cState_4, cNumStates};
for (int i = 0; i < numStates; i++) {
    // do something with i
}

相关内容

最新更新