C++ 对用户界面函数使用枚举类型是个好主意吗?

C++ 对用户界面函数使用枚举类型是个好主意吗?,c++,c++11,C++,C++11,假设我正在构建一个简单的类,在屏幕上打印一些文本,它可以更改文本的颜色 myclass a("this is the text"); a.setColor("green"); 我还在学习C++,最近我被介绍到EnUM,我想我会尝试一下。我想知道在像上面的setColor这样的接口函数中使用枚举类型是否是一种好的做法 在接口函数中使用枚举类的优点或缺点是什么?是否有比之更适用的情况,是否有不适合使用的情况 如果要合并属性,该怎么办?例如 a.setAttribute("bold reverse"

假设我正在构建一个简单的类,在屏幕上打印一些文本,它可以更改文本的颜色

myclass a("this is the text");
a.setColor("green");
我还在学习C++,最近我被介绍到EnUM,我想我会尝试一下。我想知道在像上面的setColor这样的接口函数中使用枚举类型是否是一种好的做法

在接口函数中使用枚举类的优点或缺点是什么?是否有比之更适用的情况,是否有不适合使用的情况

如果要合并属性,该怎么办?例如

a.setAttribute("bold reverse");
我不知道接口是否是我想要描述的正确术语:我的类的用户最终将使用的函数。

是的,在这种情况下使用枚举似乎比使用实际字符串更好

一个明显的优势是打字能力强

如果setColor接受char*,就像您的情况一样,您可以执行以下操作:

 a.setColor("horse");
您只能在运行时将其检测为错误

如果setColor将eColors作为参数:

 a.setColor(eGreen);
 a.setColor(eRed);
会编译,但是

 a.setColor(eHorse);

不会。

在您的情况下,至少有两个优点:

无需在运行时解析字符串,从而提高了效率。可以在switch语句中直接使用enum变量。 枚举在某种程度上是自文档化的,代码的用户必须努力提供无效值。 一个潜在的缺点是颜色字符串来自运行时用户输入,例如他们在文本框或其他地方键入的用户输入。您需要解析此字符串并将其转换为枚举。但这并不是一个真正的缺点,因为你无论如何都需要这样做。最佳实践是让用户界面逻辑验证字符串并尽早转换为enum

如果要合并属性,该怎么办

我至少可以想到三种选择:

对setAttribute使用多个调用。 传递一个属性数组。 将每个枚举值定义为二的幂,然后可以将枚举与|组合。
在这种情况下,枚举肯定比字符串更显式。至于值的串联,可以使用一些小技巧来实现。将枚举的值设置为2的幂递增,然后可以将它们合并

enum TextAttributes {
    Bold = 1,
    Italic = 2,
    Reverse = 4,
    StrikeThrough = 8,
    Underline = 16
};

TextAttributes attr = Bold | Reverse;

使用此方法,我无法使用枚举类,对吗?意思是这不是强类型的?正确。您不能将开关用于此方法。@romeovs可以使用作用域枚举:您可以为它们重载位运算符。这可能意味着需要大量的样板文件,但可以重构以便于重用。@romeovs:我不这么认为。因此,我对这个选项不太感兴趣。我正在使用std::initializer\u list来解决这个问题!