提问人:Saswatajiko 提问时间:10/10/2023 最后编辑:Saswatajiko 更新时间:10/15/2023 访问量:67
如何在 C++ 的枚举类中编写枚举类?
How do I write enum classes within enum classes in C++?
问:
我正在编写一个更大的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> ¶ms) = 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) { ... }
答: 暂无答案
评论
vector<Component>
using namespace std;
class
enum class
scoped enum
inline
inline