Итак, я делаю библиотеку для небольшого движка D2D; но дело не в этом, дело в том, что у меня есть этот класс, который будет базовым классом, который наследует класс пользователя. Моя основная идея была бы примерно такой:
struct BaseEngine {
// I have two pure virtual functions so the user has to define them.
virtual bool onLoad() = 0;
virtual bool onFrame() = 0;
};
Теперь, если бы все это было в одном проекте, я мог бы сделать что-то вроде этого сразу после этого:
struct Derived : public BaseEngine {
bool onLoad() override;
bool onFrame() override;
};
const std::unique_ptr<BaseEngine> app = std::make_unique<Derived>();
Но на самом деле моя идея состоит в том, чтобы не хранить производный класс в моих заголовочных файлах и создавать библиотеку без какого-либо возможного определения производного класса, поэтому пользователь может просто назвать его как угодно в своем проекте.
Конечно, это не позволит мне скомпилировать его, потому что я не могу создать BaseEngine
, потому что он имеет чисто виртуальные функции.
Тогда я хотя бы каким-то образом использовал шаблоны для решения этой проблемы? Сейчас я не очень знаком с шаблонами, но моя идея заключалась в том, чтобы сделать что-то вроде:
std::unique_ptr<BaseEngine> app;
template<class T : public BaseEngine>
void instantiator() {
app = std::make_unique<T>();
}
Зная, что T
содержит реализацию для onLoad()
и onFrame()
. Но, конечно, когда мне нужна такая функция, как шаблоны явно производных классов, никакой функции не существует (по крайней мере, я не знаю об этом).
Мой главный вопрос: есть ли способ мне инициализировать объект из «неизвестного» производного класса моего известного базового класса?
Редактировать: забыл упомянуть, что основная функция (в данном случае WinMain) будет работать на движке сторона, так как она заботится о регистрации класса окна и всех этих неприятных сообщениях.