鱼C论坛

 找回密码
 立即注册
查看: 663|回复: 1

[已解决]c++中的枚举

[复制链接]
发表于 2020-7-8 13:13:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
感觉c++中的枚举这个东西好像和python中的元组比较像,他俩一样吗?
枚举这个东西我感觉没什么用呀,有没有明白的鱼油给我分享一些需要用它的例子
最佳答案
2020-7-8 14:08:03
本帖最后由 赚小钱 于 2020-7-8 14:15 编辑

结论: 枚举是类型系统中,非常非常非常非常重要的一种数据类型。

当枚举类型作为函数参数时,可以起到限制用户输入的功能。比如定义
enum Color {
    RED,
    GREEN,
    BLUE,
}

如果一个函数要求的参数是 Color 类型,用户的输入只能是 Color::RED, Color::GREEN, Color::BLUE, 其他的输入都是非法的。

当使用枚举作为返回值时,可以保证函数的健壮性。

考虑这样两种情况,c 语言的字符串转数值函数族
       #include <stdlib.h>

       int atoi(const char *nptr);

这是一个设计的非常糟糕的函数,正确执行时,函数返回转换结果,执行错误时,函数返回 0 (至少我是用 archlinux 测试是返回0的)

所以,一个问题就是当返回0的时候,如何知道,确实是0,还是转换错误了。

此时,枚举类型就非常有用.

假设有这样一个枚举类型
enum Result<T, E> {
    Ok(T),
    Err(E),
}

使用这个枚举类型就可以将函数改写一下
Result<int, string> atoi(const char* input);

执行成功时,返回 Ok(int), 里面的值为转换结果,
执行错误时,返回Err(string), 里面的值为错误原因

这样,atoi 这个函数就不会存在二义性了。


至于与 python 的对比,我觉得就不具有对比性。
enum 是一个具体的类型,用户在使用之前,需要先声明这个类型,
而在python 中使用 tuple 时,会有人先定义一个具体的 比如 Tuple MyTupleType(int, string, string) (其实我都不知道能不能先定义一个具体的 tuple 类型的。。。)

而且,二者要解决的问题也不同。
一个 enum 变量,在任意时刻只能表示 enum 类型中的某一指定值,比如上面说的 RED GREEN BLUE 或者 Ok Err,字段之间的关系是互斥的。
tuple 的用法,个人感觉更像是返回一个匿名的,临时使用的,简单的类型。

以上都建立在我对 python 粗浅的了解的基础之上,如有问题,请指正。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-8 14:08:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 赚小钱 于 2020-7-8 14:15 编辑

结论: 枚举是类型系统中,非常非常非常非常重要的一种数据类型。

当枚举类型作为函数参数时,可以起到限制用户输入的功能。比如定义
enum Color {
    RED,
    GREEN,
    BLUE,
}

如果一个函数要求的参数是 Color 类型,用户的输入只能是 Color::RED, Color::GREEN, Color::BLUE, 其他的输入都是非法的。

当使用枚举作为返回值时,可以保证函数的健壮性。

考虑这样两种情况,c 语言的字符串转数值函数族
       #include <stdlib.h>

       int atoi(const char *nptr);

这是一个设计的非常糟糕的函数,正确执行时,函数返回转换结果,执行错误时,函数返回 0 (至少我是用 archlinux 测试是返回0的)

所以,一个问题就是当返回0的时候,如何知道,确实是0,还是转换错误了。

此时,枚举类型就非常有用.

假设有这样一个枚举类型
enum Result<T, E> {
    Ok(T),
    Err(E),
}

使用这个枚举类型就可以将函数改写一下
Result<int, string> atoi(const char* input);

执行成功时,返回 Ok(int), 里面的值为转换结果,
执行错误时,返回Err(string), 里面的值为错误原因

这样,atoi 这个函数就不会存在二义性了。


至于与 python 的对比,我觉得就不具有对比性。
enum 是一个具体的类型,用户在使用之前,需要先声明这个类型,
而在python 中使用 tuple 时,会有人先定义一个具体的 比如 Tuple MyTupleType(int, string, string) (其实我都不知道能不能先定义一个具体的 tuple 类型的。。。)

而且,二者要解决的问题也不同。
一个 enum 变量,在任意时刻只能表示 enum 类型中的某一指定值,比如上面说的 RED GREEN BLUE 或者 Ok Err,字段之间的关系是互斥的。
tuple 的用法,个人感觉更像是返回一个匿名的,临时使用的,简单的类型。

以上都建立在我对 python 粗浅的了解的基础之上,如有问题,请指正。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
小甲鱼的铁粉 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 13:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表