0

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

myclass a("this is the text");
a.setColor("green");

我仍在学习 C++,我最近被介绍enum并想尝试一下。enum我想知道在上面的接口函数中使用类型是否是一种好习惯setColor

enum在接口函数中使用类有什么好处或坏处?是否存在它们比它们更适用的情况,是否存在它们不适合使用的情况?

如果我想组合属性怎么办?例如

a.setAttribute("bold reverse");

我不知道接口是否是我想要描述的正确术语:我的班级的用户最终会使用的功能。

4

3 回答 3

8

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

  • 无需在运行时解析字符串,效率更高。switch您可以直接在语句中使用枚举变量。
  • 枚举(在某种程度上)是自记录的,代码的用户必须努力工作以提供无效值。

一个潜在的“缺点”是颜色字符串来自例如运行时用户输入的情况(他们已经键入文本框或其他内容)。您将需要解析此字符串并将其转换为枚举。但这并不是真正的劣势,因为无论如何您都需要这样做。最佳实践是让用户界面逻辑尽早验证字符串并转换为枚举。

如果我想组合属性怎么办?

我能想到至少三个选项:

  • 多次调用setAttribute.
  • 传递一组属性。
  • 将每个枚举值定义为 2 的幂,然后您可以将枚举与|.
于 2012-05-23T11:45:01.553 回答
3

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

一个明显的优势 - 强大的打字。

如果setColor接受 a char*,就像你的情况一样,你可以这样做:

 a.setColor("horse");

您只能在运行时将其检测为错误。

如果setColor采用eColorsas 参数:

 a.setColor(eGreen);
 a.setColor(eRed);

会编译,但是

 a.setColor(eHorse);

不会。

于 2012-05-23T11:44:40.447 回答
0

在这种情况下,枚举肯定比字符串更明确。至于值的连接,您可以使用一些小技巧来完成这项工作。将您的枚举值设置为 2 的递增幂,然后您可以将它们组合在一起。

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

TextAttributes attr = Bold | Reverse;
于 2012-05-23T11:58:00.197 回答