如何在 C++ 的枚举类中编写枚举类?

How do I write enum classes within enum classes in C++?

提问人:Saswatajiko 提问时间:10/10/2023 最后编辑:Saswatajiko 更新时间:10/15/2023 访问量:67

问:

我正在编写一个更大的C++程序的一部分。

我想写一个头文件,比如说,“Component.h”,代码是这样的......

class Component{
    private:
        int value;
        ComponentType component_type;
        vector<Component> components_this_component_derives_from;
        ...
        ...
    protected:
        inline void setValue(int value) { this->value = value; }
        inline int getValue() { return value; }
        inline ComponentType getComponentType() { return component_type; }
        inline void setComponentType(ComponentType component_type) { this->component_type = component_type; }
    public:
        Component() { value = 0; }
        ~Component() {}
        void setupDependentComponents(vector<Component> dependentComponents){
            components_this_component_derives_from = dependentComponents;
        }
        virtual void setupParams(vector<string> &params) = 0;
        virtual void init() = 0; // This is where setComponentType() is called
        virtual bool isValid() = 0; // This is where dependent component types are checked and polymorphic behaviour of the component set up
        virtual void calculate(customDataType custom_data) = 0;
}

所有必需的“组件”都将继承它作为父类。某些组件需要从某种类型的组件派生,或者根据它设置为派生的组件类型而有不同的行为。例如,我希望 ComponentA 依赖于一个组件。如果它依赖于 ComponentType::TypeX 的组件 B,它会将此值乘以 2 并使用 this 调用 setValue()。但是,如果组件 B 是 ComponentType::TypeY,它将对这个值进行平方,并用它调用 setValue()。

我通过写以下内容取得了如此多的成就......

enum class ComponentType{
    TypeX, TypeY, TypeZ
};

但是,现在我需要将每个组件类型划分为子类型。比如...

enum class ComponentType{
    enum class{
        SubTypeA, SubTypeB
    }TypeX,
    enum class{
        SubTypeA, SubTypeC, SubTypeD
    }TypeY,
    TypeZ
};

如果需要,我想在 Type 本身以及 SubType 上使用 if/switch 语句,所以我不确定命名空间是否有效。

我想用 if 语句编写的那种代码是这样的......

if(ComponentP.getComponentType != ComponentType::TypeX){
    cerr << "Unexpected component type" << endl;
    abort();
}
if(ComponentP.getComponentType == ComponentType::TypeX::SubTypeA){
    ...
} else {
    ...
}

我该怎么做?

编辑:仅仅编写一个命名空间来代替外部枚举是没有用的,因为并非所有组件类型都有子类型,也因为我不能写类似 TypeA 只是一个命名空间的东西。if(ComponentA.getComponentType() == ComponentType::TypeA) { ... }

C++ 枚举嵌 命名空间 C++14

评论

1赞 Marek R 10/10/2023
题外话但很重要:stackoverflow.com/questions/1452721/...,因为您的代码表明您正在头文件中执行操作(因此最坏的情况)。vector<Component>using namespace std;
0赞 BoP 10/10/2023
尽管使用了这个词,但 an 不是一个类!如果委员会于为此添加一个新关键字,它本可以代替。现在他们“作弊”并重用了现有的关键字,尽管它非常令人困惑。classenum classscoped enum
0赞 Pete Becker 10/10/2023
次要的一点:当一个函数在类定义中定义时,它是隐式的;你不必标记它.inlineinline

答: 暂无答案