我在头文件中声明了一个强类型枚举。但是,即使我用它定义了一个成员函数,在cpp中也不需要包含。参考这篇stackoverflow文章,这应该不起作用。没有其他间接包含枚举的include。
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)
{
}
这是c++ 11中的一个新特性。
enums消除了对整型#define常量的需要,但仍然存在一些严重的问题(比如它允许与其他枚举类型进行比较,这是没有意义的)。因此,c++ 11中引入了强类型枚举(枚举类)。使用类这个词是为了表明每个枚举类型确实是不同的,与其他枚举类型没有可比性。枚举类有一些优点,比如更好的作用域和您提到的前向声明的特性。它与你的链接中的类不一样。
为什么这个有用??前向声明通常是关于物理布局的代码在磁盘上放入不同的文件或提供不透明对象作为API的一部分。在第一种情况下,你关心关于物理磁盘布局,使用前向声明允许您在头文件中声明枚举类型,同时将特定的值到CPP文件中。这允许您更改可能的列表枚举值非常频繁,而不会强制所有依赖文件编译。在第二种情况下,枚举类可以公开为从一个API函数返回的类型安全但不透明的值传递给另一个API函数。使用API的代码则不需要了解该类型可以接受的可能值。因为编译器仍然知道类型,它可以强制变量声明为使用该类型的操作不要与使用的变量混淆另一种类型。
请参考这里。
示例如下:
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
另一个例子:
#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;
}