【问题标题】:Enum inside enum on C++C ++中的枚举内的枚举
【发布时间】:2013-04-11 13:29:39
【问题描述】:

我正在尝试构建基于常量的结构。我有ObjectTypes (KEYBOARD, MOUSE, HAPTIC...),它可以有InputTypes(鼠标可以是默认值和反转,而键盘可以是默认值和数字,而触觉只能是默认值)。

为了使这项工作正常工作,我尝试在 C++ 中名为 Constants 的类中使用枚举内的枚举。将ObjectTypes 参数和InputTypes 参数传递给函数可能会起作用,所以我在原型中需要这样的东西:

changeInputSystem(SimulatorConstants::InputObject input, SimulatorConstants::InputTypes type)

但是在 C++ 中,当我声明一个枚举时(内部)从中取出的每个值,其中一些替换其他的。

我现在的代码(不工作)是:

    enum InputObject {
        KEYBOARD,
    MOUSE,
    HAPTIC
};

enum InputTypes {
    enum KeyboardTypes {
        DEFAULT
    };
    enum MouseTypes {
        DEFAULT,
        INVERSE
    };
    enum HapticTypes {
        DEFAULT
    };
};

注意:我知道枚举之间没有继承,所以我需要任何可以以类似方式工作的解决方案。 谢谢。

【问题讨论】:

  • 你不能有嵌套的枚举。枚举是命名常量,而不是用户定义的数据类型,如结构或类。
  • 如我所说,我知道这一点,但不知道如何用另一种结构解决它
  • 为什么不用 struct InputTypes { enum { ... } enum {..} } 代替?
  • 也许您想使用union
  • 如果你可以使用enum class,那将解决你几个DEFAULTs的冲突。您仍然需要将类型枚举类放在结构或命名空间中以捆绑它们。

标签: c++ enums constants


【解决方案1】:

如果你做的都是面向对象的事情,它就可以工作。因此,与其对所有事物进行枚举,不如使用类:

class InputObject {};

class Mouse : public InputObject
{
  void setDefault();
  void setInverse();
};

这样可以将 InputObject 的类型保存在对象中,而您只需传递实际的 InputObject。

【讨论】:

  • 是的,它有效,但我不能用 switch 语句做我想做的事,让我的代码更干净
  • @Feantury 你可以使用方法inheritance代替switch
  • 对我来说这是一个有效的答案,但过于复杂,无法管理一些常量,我更喜欢枚举、结构和重载。还是谢谢
【解决方案2】:

就像在 cmets 中写的一样,如果您可以访问 C++11 编译器,最好使用枚举类,这会将您自己接受的答案(在撰写本文时)代码更改为:

enum class KeyboardTypes {
   DEFAULT
};
enum class MouseTypes {
  DEFAULT,
   INVERSE
};
enum class HapticTypes {
   DEFAULT
};

当然,您的重载函数可以更改为更自然的版本:

void changeInputSystem(SimulatorConstants::MouseTypes type);
void changeInputSystem(SimulatorConstants::KeyboardTypes type);
void changeInputSystem(SimulatorConstants::HapticTypes type);

而且,作为奖励,您的枚举不会隐式转换为整数值。

【讨论】:

    【解决方案3】:

    好的,做一些证明我终于用重载解决了它。我通过重载方法并创建三个不同的结构删除了 ObjectTypes:

    struct KeyboardTypes {
       enum types{
          DEFAULT
       };
    };
    struct MouseTypes {
       enum types{
          DEFAULT,
          INVERSE
       };
    };
    struct HapticTypes {
       enum types{
          DEFAULT
       };
    };
    

    以及重载的成员函数:

    void changeInputSystem(SimulatorConstants::MouseTypes::types type);
    void changeInputSystem(SimulatorConstants::KeyboardTypes::types type);
    void changeInputSystem(SimulatorConstants::HapticTypes::types type);
    

    感谢所有帮助过的人。

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      相关资源
      最近更新 更多