首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++枚举类可以有方法吗?

C++枚举类可以有方法吗?
EN

Stack Overflow用户
提问于 2014-01-23 07:04:11
回答 4查看 112.9K关注 0票数 192

我有一个具有两个值的枚举类,我想创建一个接收一个值并返回另一个值的方法。我还想维护类型安全(这就是我使用枚举类而不是枚举的原因)。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-23 07:09:01

不,他们不能。

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

代码语言:javascript
复制
class Foo {
public:
  enum {BAR, BAZ};
};

然而,这只是语法。再说一次,enum class不是class

票数 152
EN

Stack Overflow用户

发布于 2018-11-13 23:13:02

虽然“你不能”的答案在技术上是正确的,但我相信你可以使用以下想法来实现你正在寻找的行为:

我假设你想要写下这样的代码:

代码语言:javascript
复制
Fruit f = Fruit::Strawberry;
f.IsYellow();

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

代码语言:javascript
复制
enum class Fruit : uint8_t
{
  Apple, 
  Pear,
  Banana,
  Strawberry,

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

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

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

代码语言:javascript
复制
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() = 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;
};

现在你可以写下:

代码语言:javascript
复制
Fruit f = Fruit::Strawberry;
f.IsYellow();

编译器会阻止类似这样的事情发生:

代码语言:javascript
复制
Fruit f = 1;  // Compile time error.

您可以很容易地添加这样的方法:

代码语言:javascript
复制
Fruit f("Apple");

代码语言:javascript
复制
f.ToString();

可以被支持。

票数 130
EN

Stack Overflow用户

发布于 2017-02-19 05:52:11

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

代码语言:javascript
复制
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 "";
    }
};
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21295935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档