美文网首页
(十六)QT专题-C++枚举

(十六)QT专题-C++枚举

作者: GoodTekken | 来源:发表于2023-02-21 08:17 被阅读0次

C++使用颇具特色的枚举(enumeration)声明给定名字的常量,这和C#以及最近版本的Java所提供的方式相似。现在,假定我们需要在程序中存储一周中的一天:

enum DayWeek
{
 Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
};

通常情况下,我们将会把这一声明放在一个头文件中,或者甚至会放进一个类中。上面的声明可以简单地与下列常量的定义相等价:

const int Sunday   =  0;
const int Monday   = 1;
const int Tuesday  = 2;
const int Wednesday = 3;
const int Thursday = 4;
const int Friday    = 5;
const int Saturday = 6; 

通过使用枚举结构,我们可以在后面声明一些DayOfWeek类型的变量或者参数,并且编译器将可以确保只对那些来自DayOfWeek枚举中的变量才赋值。例如:

DayOfWeek day = Sunday;

如果我们不关心类型安全性(type safety),那么也可以写作:

int day = Sunday;

需要注意的是,为了读取DayOfWeek枚举中的Sunday常量,我们只需写作Sunday即可,而不必写成DayOfWeek::Sunday。
默认情况下,编译器会从0开始给枚举中的常数值分配连续的整数型。如果需要,也可以把它们指定成其他的常量值:

enum DayOfWeek
{
 Sunday    = 628,
 Monday   = 616,
 Tuesday  = 735,
 Wednesday = 932,
 Thursday  = 852,
 Friday     = 607,
 Saturday = 845
};

如果没有给某个枚举元素制定值,那么该元素机会用前面元素的取值加1来作为自己的取值。有时候,枚举用于声明整形常量,这时,我们通常会忽略枚举的名字:

enum
{
 FirstPort = 1024,
 MaxPorts = 32767
};

另外一种常见的枚举用法是用来表达选项的集合。我们以那个Find对话框为例,假定它有四个复选框,分别用来控制查询算法(使用通配符、区分大小写、向前查找以及循环查找)。我们可以用一个以2的幂次方为值得枚举常量来表示这一算法:

enum FindOption
{
 NoOptions          = 0x00000000,
 WildcardSyntax  = 0x00000001,
 CaseSensitive    = 0x00000002,
 SearchBackward= 0x00000004,
 WrapAround       = 0x00000008
};

每个选项通常都称为“标记”(flag)。我们可以使用按位“|”或者“|=”运算符来组合这些标记:

int options = NoOptions;
if(wildcardSyntaxCheckBox ->isChecked())
{
 options |= WildcardSyntax;
}

if(caseSensitiveCheckBox ->isChecked())
{
 options |= CaseSensitive;
}

if(searchBackwardCheckBox ->isChecked())
{
 options |= SearchBackward;
}
if(wrapAroundCheckBox ->isChecked())
{
 options |= WrapAround;
}

可以使用按位“&”运算符来测试是否选中了某个标记:

if(options & CaseSensitive)
{
 // case-sensitive search
}

一个类型为FindOption的变量每次只能包含一个标记。使用“|”对多个标记符组合的结果就是一个普通的整数。但不幸的是,这样做并不具备类型安全性: 如果一个函数期望通过一个 int 参数获得FindOptions的组合结果,但接收的却是Saturday,而编译器却不会对此报错。Qt使用QFlags<T>来对它自己的标记类型的数据提供类型安全性保障。当我们定义一些自定义类型时,也是可以使用这个类的。更为详尽的内容请参考QFlags<T>的在线文档。

相关文章

网友评论

      本文标题:(十六)QT专题-C++枚举

      本文链接:https://www.haomeiwen.com/subject/kcbgkdtx.html