关于在C ++中扩展enum

时间:2013-06-17 20:39:24

标签: c++ enums

假设我有一个基类,其方法是返回其实例的状态:

enum STATE {ALIVE, DEAD}

class BASE{
    virtual STATE doThingsAndReturnStatus() {...};
}

现在我的派生类可能有其他状态,例如HALFDEAD。它看起来很难让接口保持一致,除非每个派生类我需要全局添加一个STATE。 (即将新项目添加到STATE中的class BASE定义中)。我的问题是如何实现派生类的这种类型的扩展而不触及基类或文件包含它。)

没有必要仅限制关于“枚举”的讨论。

我在这里找到了一个相关的帖子。但它不符合我的需求:

Extending enums in C++?

2 个答案:

答案 0 :(得分:3)

您可以将enum替换为intstringfloat或其他类似内容。

但是,这也许不是一个好主意。假设我们可以扩展enum [在具有此功能的C ++的虚构版本中],因为getMyStatus是一个虚函数,它被设计为从不知道细节的通用代码调用派生类的。所以如果你写的东西如下:

for(iter : baseClassContainter)
{
    status = iter->getMyStatus();
    switch(status)
    {
       case DEAD: 
            ... do some stuff here. 
            break;

       case ALIVE:
            ..... do some stuff here ... 

    }
}

这段代码应该用“HALFDEAD”做什么?它甚至不知道这样的值存在,因为[在我们支持这个的虚构语言中]它只存在于派生类中......

答案 1 :(得分:1)

你可以接近:

constexpr STATE HALFDEAD = static_cast<STATE>(DEAD+1);

但您有责任确保上述值(DEAD+1)不等于任何其他枚举器。