C 枚举类可以有方法吗?

新手上路,请多包涵

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

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

原文由 bsky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 837
2 个回答

不,他们不能。

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

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

但是,这只是语法。同样, enum class 不是 class

原文由 Stefano Sanfilippo 发布,翻译遵循 CC BY-SA 4.0 许可协议

基于 jtlim的回答

想法(解决方案)

 enum ErrorType: int {
  noConnection,
  noMemory
};

class Error {
public:
  Error() = default;
  constexpr Error(ErrorType type) : type(type) { }

  operator ErrorType() const { return type; }
  constexpr bool operator == (Error error) const { return type == error.type; }
  constexpr bool operator != (Error error) const { return type != error.type; }
  constexpr bool operator == (ErrorType errorType) const { return type == errorType; }
  constexpr bool operator != (ErrorType errorType) const { return type != errorType; }

  String description() {
    switch (type) {
    case noConnection: return "no connection";
    case noMemory: return "no memory";
    default: return "undefined error";
    }
 }

private:
  ErrorType type;
};

用法

Error err = Error(noConnection);
err = noMemory;
print("1 " + err.description());

switch (err) {
  case noConnection:
    print("2 bad connection");
    break;
  case noMemory:
    print("2 disk is full");
    break;
  default:
    print("2 oops");
    break;
}

if (err == noMemory) { print("3 Errors match"); }
if (err != noConnection) { print("4 Errors don't match"); }

原文由 Vasily Bodnarchuk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题