将枚举 class 传播到更高级别 class

Propagate an enum class to a higher level class

这是一个相当基本的问题,但我想就最佳做法提供一些意见。我的问题是如何将枚举从子 class 传播到更高级别 class,以便它对主 class 的调用者可见?

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

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

为什么要传播什么?就像你的子对象有明确的枚举一样,你可以直接使用它们。一旦你有了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};