c++ - 将枚举类传播到更高级别的类

标签 c++ oop c++11 enums class-design

这是一个相当基本的问题,但我想要一些关于最佳实践的意见。我的问题是如何将枚举从子类传播到更高级别的类,以便主类的调用者可以看到它?

例如,假设我有一个自行车类。 Bike 将初始化构成自行车的子类 Wheel、Frame、Chain 等。 Frame 可能有一个枚举,例如 FrameColor,Chain 可能有一个枚举,例如 LinkType 等。现在假设一些更高级别的代码想要构造一个 Bike 类。 Bike 的构造函数要求调用者指定 LinkType、FrameColor 等。我想避免将枚举定义放在全局头文件中,因为这是不好的 C++ 风格。

我想到了两种可能的方法,但必须有一种更简单、更干净的方法:

  • 使用抽象类定义接口(interface)

  • 转发声明枚举

最佳答案

为什么你需要传播任何东西?就像你的子对象有明确的枚举一样,你可以直接使用它们。一旦有了 Frame::Color,您就不需要制作 Bike::Frame::Color... 一个就足够了。例如:

struct Frame {
    enum class Color {
        BLACK, RED
    };

    Color c;
};

struct Bike {
    Bike(Frame::Color c /*, Chain::LinkType lt, ..., */)
        : frame{c}
    { }

    Frame frame;
};

int main() {
    Bike b{Frame::Color::RED};
}

现在,如果 Frame 嵌套在 Bike 内部,您只需为枚举添加别名即可:

struct Bike {
    struct Frame {
        enum class Color { ... };
    };

    using FrameColor = Frame::Color;
};

Bike b{Bike::FrameColor::RED};

关于c++ - 将枚举类传播到更高级别的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30288743/

相关文章:

javascript假实例

c# - 为特定用例扩展基础模型类

c++ - 在参数构造中使用 std::move

c++ - constexpr exp、log、pow

c++ - 程序 C++ 中的杂散 '\253' 和 '\307'

c++ - 我的代码会安全地检查下溢吗?

c++ - 在磁盘上存储列并读取行

c++ - 无法将模板化函数显式实例化为模板化类

c++ - 碰撞解决 - 圆外点

python - 如何制作一个用方括号调用的方法?