Я пытаюсь создать такую систему, как Java swing
, где у вас есть окно, и это окно имеет несколько компонентов, таких как ярлыки (текст/изображения), текстовые поля, проверка Коробки и т. Д. Способ swing
заключается в том, что существует класс Component
, который является абстрактным, который имеет абстрактный метод рисования, который рисует компонент и некоторые другие методы. Фактическое окно (JFrame
) имеет список (всех видов) всех компонентов в окне. Фактические типы этих компонентов неизвестны, но все они расширяют класс Component
.C++ создать объект, тип которого является абстрактным классом
Мой Window
класс:
class Window {
public:
...
template<typename T, typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr> T addComponent(T component);
private:
...
std::vector<Component> components;
...
};
Component
:
class Component {
public:
...
virtual void paintComponent() = 0;
...
};
Где-то вдоль линии, этот код называется:
for each (Component c in components) {
c.paintComponent();
}
Однако, я не могу сделать объект типа Component
, потому что он абстрактный, хотя фактическими объектами были бы другие типы, которые распространяютComponent
и имеют свой собственный метод paintComponent()
. Для методов (Window::addComponent()
), я могу использовать
template<typename T, typename std::enable_if<std::is_base_of<Component, T>::value>::type* = nullptr> T
однако, это не работает для переменных.
Итак, мой вопрос, Как сделать объект абстрактного типа, то есть, как мне сделать Component
объект (или объект, который расширяет компонент, но чей фактический тип неизвестен)?
Заранее благодарен!
Вы не можете сделать объект абстрактного типа. Вы спрашиваете, как реализовать 'instanceof' в C++? Если это так, проверьте 'dynamic_cast'. (Как побочный вопрос, посмотрели ли вы на существующие кросс-платформенные инструменты для виджетов C++, такие как Qt и wx-widgets?) –
@Andy Извините, я не был ясен по этому вопросу, я хочу создать объект, который расширяет абстрактный тип , но фактический тип которого неизвестен. – ricky3350