当前位置: 首页 > 知识库问答 >
问题:

C枚举类可以有方法吗?

盖晋
2023-03-14

我有一个包含两个值的枚举类,我想创建一个接收一个值并返回另一个值的方法。我还想保持类型安全(这就是为什么我使用枚举类而不是枚举)。

http://www.cplusplus.com/doc/tutorial/other_data_types/没有提到任何关于方法的内容,但是,我的印象是,任何类型的类都可以有方法。

共有3个答案

景景胜
2023-03-14

专注于问题的描述而不是标题,可能的答案是

struct LowLevelMouseEvent {
    enum Enum {
        mouse_event_uninitialized = -2000000000, // generate crash if try to use it uninitialized.
        mouse_event_unknown = 0,
        mouse_event_unimplemented,
        mouse_event_unnecessary,
        mouse_event_move,
        mouse_event_left_down,
        mouse_event_left_up,
        mouse_event_right_down,
        mouse_event_right_up,
        mouse_event_middle_down,
        mouse_event_middle_up,
        mouse_event_wheel
    };
    static const char* ToStr (const type::LowLevelMouseEvent::Enum& event)
    {
        switch (event) {
            case mouse_event_unknown:         return "unknown";
            case mouse_event_unimplemented:   return "unimplemented";
            case mouse_event_unnecessary:     return "unnecessary";
            case mouse_event_move:            return "move";
            case mouse_event_left_down:       return "left down";
            case mouse_event_left_up:         return "left up";
            case mouse_event_right_down:      return "right down";
            case mouse_event_right_up:        return "right up";
            case mouse_event_middle_down:     return "middle down";
            case mouse_event_middle_up:       return "middle up";
            case mouse_event_wheel:           return "wheel";
            default:
                Assert (false);
                break;
        }
        return "";
    }
};
卫俊力
2023-03-14

虽然“你做不到”的回答在技术上是正确的,但我相信你可以通过以下想法实现你想要的行为:

我想你会想写这样的东西:

Fruit f = Fruit::Strawberry;
f.IsYellow();

你希望代码看起来像这样:

enum class Fruit : uint8_t
{
  Apple, 
  Pear,
  Banana,
  Strawberry,

  bool IsYellow() { return this == Banana; }
};

但当然,它不起作用,因为枚举不能有方法(“this”在上面的上下文中没有任何意义)

但是,如果使用包含非类枚举的普通类和包含该类型值的单个成员变量的思想,则可以非常接近所需的语法/行为/类型安全性。即。:

class Fruit
{
public:
  enum Value : uint8_t
  {
    Apple,
    Pear,
    Banana,
    Strawberry
  };

  Fruit() = default;
  constexpr Fruit(Value aFruit) : value(aFruit) { }

#if Enable switch(fruit) use case:
  // Allow switch and comparisons.
  constexpr operator Value() const { return value; }

  // Prevent usage: if(fruit)
  explicit operator bool() const = delete;        
#else
  constexpr bool operator==(Fruit a) const { return value == a.value; }
  constexpr bool operator!=(Fruit a) const { return value != a.value; }
#endif

  constexpr bool IsYellow() const { return value == Banana; }

private:
  Value value;
};

现在您可以编写:

Fruit f = Fruit::Strawberry;
f.IsYellow();

编译器将阻止以下情况:

Fruit f = 1;  // Compile time error.

您可以轻松添加以下方法:

Fruit f("Apple");

f.ToString();

可以支持。

郗奇玮
2023-03-14

不,他们不能。

我可以理解,C 11中强类型枚举的枚举类部分似乎暗示您的枚举也具有类的特性,但事实并非如此。我有根据地猜测,关键字的选择是受到了我们在C 11之前用于获取作用域枚举的模式的启发:

class Foo {
public:
  enum {BAR, BAZ};
};

然而,这只是语法。同样,枚举类不是类。

 类似资料:
  • 问题内容: 枚举可以有抽象方法吗?如果是这样,有什么用,并给出一个场景来说明这种用法。 问题答案: 是的,但是您可能更喜欢实现接口的枚举,请看这里。我认为它看起来好多了。这是抽象方法的示例:

  • 枚举类型(也可以称为“枚举器”)由一组具有独立标识符(名称)的整数类型常量构成,在 C# 中枚举类型不仅可以在类或结构体的内部声明,也可以在类或结构体的外部声明,默认情况下枚举类型中成员的默认值是从 0 开始的,然后逐一递增。 在 C# 中可以使用 enum 关键字来声明枚举类型,语法格式如下所示: enum enum_name{     enumeration list; } 其中,enum_n

  • 问题内容: 在Java中,Enum可以完成Enums所做的伟大工作,但也可以具有方法(行为和逻辑)。与使用枚举类相比,这有什么优势?简单的例子来说明这一点也将受到欢迎。 问题答案: 这是一个简单的例子:

  • 本文向大家介绍C#中可枚举类型详解,包括了C#中可枚举类型详解的使用技巧和注意事项,需要的朋友参考一下 枚举是迭代一个集合中的数据项的过程。 我们经常使用的大多数集合实际上都已经实现了枚举的接口IEnumerable和IEnumerator接口,这样才能使用foreach迭代,有些是含有某种抽象了枚举细节的接口:ArrayList类型有索引,BitArray有Get方法,哈希表和字典有键和值...

  • 当你进入网站时,按钮“继续”可以有两个选项:class="button "或class="btn "。如何在一个FindElement中同时搜索两个类?我不知道它应该是什么样子,但就像这样(示意性地) 或者更容易使用? 这不是工作。 感谢您的关注

  • 问题内容: 4年前关闭。 刚刚下载了Xcode 7 Beta,并列举了此错误 错误: 枚举不可用在序列上调用枚举方法 问题答案: 在Swift 2中,它不再是全局函数,而是的扩展。 直接在序列上调用它以进行枚举,如下所示: