Вы должны реализовать все чисто виртуальные функции из Window
в WinWindow
(те функции-члены с = 0
в объявлении). В противном случае WinWindow
будет абстрактным классом (как Window
) и экземпляры абстрактных классов не могут быть созданы, но вы пытаетесь создать экземпляр типа WinWindow
с new WinWindow(properties)
(который это то, что говорит вам ошибка).
Вы не переопределили и не реализовали многие классы, например close
, onResize
, et c.
Вы должны не игнорировать другое сообщение об ошибке. Это означает, что вы ошиблись при объявлении функции в WinWindow
.
Проблема в том, что виртуальная функция в Window
имеет такую подпись:
void setEventCallback(const EventCallbackFn callback)
Но ваше предполагаемое переопределение имеет подпись:
void SetEventCallback(const EventCallbackFn& callback)
Имена функций не совпадают, а типы параметров также не одинаковы (один является ссылкой, другой - нет). Переопределяющие функции должны соответствовать сигнатуре переопределяемых ими функций.
Не сбрасывайте и квалификатор override
. Если вы сделаете это, сообщение об ошибке исчезнет go, но фактически не решит проблему. Если вы переопределяете функцию virtual
из базового класса, всегда добавляйте override
. Тот факт, что это даст ошибку, если вы допустили ошибку, это именно то, почему она существует в первую очередь. Поэтому добавьте override
к onUpdate
и сделайте так, чтобы он соответствовал функции virtual
, которую он также должен переопределять:
void onUpdate(float timestep) override;
Дополнительные примечания, не связанные с проблемой, упомянутой в вопросе:
Также обратите внимание, что вы почти никогда не должны использовать new
непосредственно в современном C ++. Вместо этого используйте std::unique_ptr<Window>
и std::make_unique<WinWindow>
.
На самом деле, я не понимаю, почему вы возвращаете Window*
вместо WinWindow*
, поэтому сделайте так, чтобы std::unique_ptr<WinWindow>
вместо этого или даже лучше вернули WinWindow
непосредственно по значению (без каких-либо new
или std::make_unique
). Вы все еще можете переместить его в объект под управлением умного указателя на сайте вызова, если вам это нужно для полиморфизма.
Но тогда, если это так, вы также можете просто использовать WinWindow
. конструктор напрямую вместо использования метода create
. Так что create
тогда бессмысленно.
Также обратите внимание, что ключевые слова inline
полностью избыточны. Вы должны удалить их. Они ничего не делают, кроме как сбивают с толку читателя (например: вы знаете, что они имеют в виду?). Функции, определенные непосредственно в определении класса, inline
автоматически.
Также обратите внимание, что ваш класс WinWindow
не следует правилу 0/3/5 , потому что ваш класс управляет ресурсом (дескриптором окна), и вы дали ему деструктор, который делает что-то нетривиальное (уничтожение окна), но вы не реализовали семантически правильный конструктор копирования и оператор присваивания копии. Следовательно, ваш класс сломается, если вы когда-нибудь явно или неявно скопируете его. Это происходит, в частности, когда вы используете конструктор WinWindow
напрямую, например, для возврата по значению в create
, как я предлагал выше. Поэтому до тех пор, пока вы не исправите это, вы должны придерживаться std::unique_ptr
/ std::make_unique
.
. В этом случае правильным решением будет реализация конструктора move и move оператор присваивания с правильной семантикой. Семанти c не имеет смысла копировать Окно (или, по крайней мере, вы на самом деле этого не хотите), но вы можете переместить дескриптор окна из одного объекта в другой.
По общему признанию, это относительно продвинутые предметы. Эта проблема не возникла бы, если бы вы просто предоставили класс-оболочку, который оборачивает библиотеку C (GLFW) в надлежащий интерфейс C ++ вместо того, чтобы делать это вручную. Я ожидаю, что ваш инструктор предоставит класс-оболочку, по крайней мере, вокруг самого дескриптора окна. Для новичка сделать это трудно или невозможно, если вы еще не изучили семантику перемещения и управление ресурсами.
Я предлагаю вам изучить у хорошую вводную книгу , которая охватывает все это, прежде чем вы попробуете что-то столь сложное.