c++ - 控制枚举值的可见性

标签 c++ arrays enums visibility

考虑一个导出枚举的 C++ 类,在该枚举上维护一个内部数组,并希望导出一个从枚举中接受值的命令。

class foo {
public:
  enum color {
    red,
    yellow,
    green,
    NUM_COLORS
  };
private:
  something somebody[NUM_COLORS];
public:
  void command(color c);
};

是否有一种干净的方法可以仅导出实际颜色,而不导出 NUM_COLORS 种颜色?当编译器的类型系统真的应该能够为我做这件事时,我不想在每次调用时都检查边缘情况。

明显的 hack 是:

class foo {
public:
  enum color {
    red,
    yellow,
    green
  };
private:
  /* something like */ const unsigned NUM_COLORS = green+1;
  unsigned LEDs_in_stock[NUM_COLORS];
public:
  void command(color c);
};

这当然是一颗定时炸弹,等待一些可怜的过度劳累的维护程序员添加蓝色 LED 的规定,而忘记更新 NUM_COLORS 行。

让我澄清一下。在这种特殊情况下,我想要的是能够说:

class foo {
public:
  enum color {
    red,
    yellow,
    green
  };
  void command(color c);
private:
  something somebody[color];
};

据我了解,C++ 不允许这样做。

最佳答案

将枚举放入基类中是一种选择吗?

class foo_enums {
public:
  enum color {
    red,
    yellow,
    green,
    NUM_COLORS
  };

protected:
  foo_enums() { }
  ~foo_enums() { }
};

class foo : public foo_enums {
private:
  unsigned LEDs_in_stock[NUM_COLORS];

  /* make NUM_* values inaccessible */
  using foo_enums::NUM_COLORS;

public:
  void command(color c);
};

我个人不会这样做,因为它看起来过于复杂。我会简单地禁止调用者传递 NUM_COLORS。没错,类型系统不会检查它。但对于人类程序员来说,这肯定是一件容易检查的事情。他们为什么要通过 NUM_COLORS

关于c++ - 控制枚举值的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5516293/

相关文章:

arrays - Kotlin - 为自定义类对象初始化一个数组

Java:实现数组中重复值的循环

java - 调用 Enum.<T>valueOf() 给出未经检查的强制转换警告,尽管 T 被声明 <T extends Enum<T>>

java - 如何从整数实例化枚举?

c++ - cscope:如何使用 cscope 通过命令行搜索符号?

c++ - 使用 gprof 和 boost

c++ - 如何在 C 中以确定的概率处理命令?

c# - 如何使用 LINQ to Entities 获取字节数组长度?

java - 当每个人都有不同的概率时,我如何选择一个随机枚举?

c++ - 无效的用户定义转换 : C++ error