包含不需要用枚举定义成员函数?

时间:2014-03-23 07:33:04

标签: c++ enums

我正在我的头文件中声明一个强类型的枚举。但是,即使我使用它定义成员函数,cpp中也不需要include。引用this stackoverflow文章这应该不起作用。没有其他包括间接包括枚举。

musicPlayer.h - Music::ID用于声明合法的成员函数

namespace Music
{
   enum class ID;
}

class MusicPlayer
{
public:
   load(Music::ID theme);
};

musicPlayer.cpp - Music::ID用于定义成员函数而不包括哪些应该是非法的

void MusicPlayer::Load(Music::ID theme)
{
} 

1 个答案:

答案 0 :(得分:1)

这是C ++ 11中的一项新功能 enums 摆脱了整数#define常量的需要,但仍然存在一些严重的问题(比如允许与其他枚举类型进行比较,这是没有意义的。)所以强烈在C ++ 11中引入了类型枚举(枚举类)。使用单词class意味着每个枚举类型确实不同,并且与其他枚举类型不可比。 枚举类具有诸如更好的范围以及您提到的前向声明的此功能等优点。它与您链接中的类不同。

  

为什么这很有用?   前瞻性声明往往是关于   磁盘上的代码物理布局到不同的文件或提供   不透明对象作为API的一部分。在第一种情况下,你在乎的地方   关于物理磁盘布局,使用前向声明允许您   在特定的情况下声明头文件中的枚举类型   值到cpp文件中。这使您可以更改可能的列表   枚举值非常频繁而不强制所有相关文件   重新编译。在第二种情况下,枚举类可以作为a公开   类型安全但从一个API函数返回的其他不透明值   被传递到另一个API函数。使用API​​的代码不需要   知道类型可以采用的可能值。自编译器   仍然知道类型,它可以强制声明的变量   使用该类型的工作不会与使用的变量混淆   另一种类型。

参考here

以下是一个例子:

enum class myStronglyTypedFloatEnum,myStronglyTypedCharEnum;

void myFunction(myStronglyTypedFloatEnum f,myStronglyTypedCharEnum c);

enum class myStronglyTypedFloatEnum : float {....}

enum class myStronglyTypedCharEnum : char {....}

这当然毫无意义,因为它们是无与伦比的:

if(myStronglyTypedFloatEnum::f == myStronglyTypedCharEnum::c)  //NOT ALLOWED

另一个example

#include <iostream>
using namespace std;
enum class fruit;
void printFruit(fruit f); //Allowed :D
enum class fruit: int {MANGO = 1,APPLE = 2};
void printFruit(fruit f)
{
    if(f == fruit::MANGO) //f == 1 will give error: no match for ‘operator==’ (operand  
                          //types are ‘fruit’ and ‘int’)
        cout<<"fruit is mango";
    else
        cout<<"fruit is apple";
}
int main() {
    fruit myfruit=fruit::MANGO;
    printFruit(myfruit);
    return 0;
}