gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:40 25 4
gpt4 key购买 nike

考虑一个导出枚举的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com