2015-05-17 5 views
2

Это довольно простая проблема, но я хотел бы получить информацию о том, что такое лучшая практика. Моя проблема заключается в том, как вы распространяете перечисление из подкласса в класс более высокого уровня, чтобы он отображался вызывающему абоненту основного класса?Распространение класса enum классу более высокого уровня

Например, скажем, у меня есть классный велосипед. Велосипед будет инициализировать подклассы Wheel, Frame, Chain и т. Д., Которые составляют байк. В кадре может быть перечисление, такое как FrameColor, Chain может иметь перечисление, такое как LinkType, и т. Д. Теперь предположим, что некоторый код более высокого уровня хочет построить класс Bike. Конструктор Bike требует, чтобы вызывающий пользователь указывал LinkType, FrameColor и т. Д. Я бы хотел, чтобы исключить определения enum внутри глобального файла заголовка, так как это плохой стиль C++.

Два возможных подхода я думал, но там должно быть проще, чище путь:

  • Используйте абстрактный класс определения интерфейса

  • вперед объявить перечисление

ответ

4

Зачем вам что-то распространять? Подобно тому, как ваши подобъекты имеют четкие перечисления, вы можете просто использовать их напрямую. Как только у вас есть 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}; 
+0

Учитывая использование операционного о «подклассов» Я считаю, что они имеют 'Frame' определены как вложенный класс 'Bike'. – Angew

 Смежные вопросы

  • Нет связанных вопросов^_^