Каждое предложение, которое я прочитал, чтобы исправить эту проблему, говорит о создании тела для деконструктора, однако я предоставляю свою собственную функцию деконструктора. Моя проблема в том, что у меня есть классы в отдельных пространствах имен, я использую чисто виртуальный класс в качестве базового класса для другого. Программа будет компилироваться, только если я возьму указатель на переменную MyScene. Мне нужно передать ссылку на Engine :: Engine :: run() или получить ошибку сегментации.
------Base Класс ------
#ifndef SCENE_H
#define SCENE_H
namespace Engine {
namespace Renderer {
class Scene
{
public:
virtual void create() = 0;
virtual void destroy() = 0;
virtual void update(double delta) = 0;
protected:
private:
};
} /* namespace Core */
} /* namespace Engine */
#endif // SCENE_H
----- MyScene. h-----
#ifndef MYSCENE_H_
#define MYSCENE_H_
#include "../Engine/Renderer/Scene.h"
namespace Game{
class MyScene : public ::Engine::Renderer::Scene {
public:
void create();
void update(double delta);
void destroy();
};
}
#endif /* MYSCENE_H_ */
-----MyScene. cpp-----
#include "MyScene.h"
#include <iostream>
namespace Game {
void create()
{
std::cout << "Scene Created!" << std::endl;
}
void destroy()
{
std::cout << "Scene Destroyed!" << std::endl;
}
void update()
{
std::cout << "Scene Updated!" << std::endl;
}
} /* namespace Game */
-----Main Function-------
#include "Engine/Engine.h"
#include "Game/MyScene.h"
int main() {
Engine::Renderer::Window window(720, 640, false, "Test");
Game::MyScene scene;
return Engine::Engine::run(window, &scene);
}
Вы еще не указали определение функций, которые вы намерены переопределить. Например, вам нужно добавить:
void MyScene::create()
{
std::cout << "Scene Created!" << std::endl;
}
Сделайте это для всех функций-членов.
void create()
который вы написали, не принадлежит ни одному классу и является функцией, не являющейся членом в пространстве имен Game
.
Причина, по которой вы получаете ошибку, - это такие определения, как: -
void create() {}
Вы должны использовать это в классе, например: -
void MyScene::create() {}
Пожалуйста, убедитесь, что вы делаете это для всех функций-членов.
Наряду с этим изменением определения обновления, чтобы принять аргумент.
Когда вы получаете класс из абстрактного класса, все абстрактные методы вашего абстрактного класса должны быть определены в вашем производном классе. Вы даже не определили метод. Когда вы определяете вне класса, используйте класс scope для определения методов и убедитесь, что вы переопределили все методы, которые являются абстрактными в вашем базовом классе.
Не забывайте, что это пустое обновление (double delta); не просто void update();