c ++ неопределенная ссылка на `vtable с виртуальными классами

0

Каждое предложение, которое я прочитал, чтобы исправить эту проблему, говорит о создании тела для деконструктора, однако я предоставляю свою собственную функцию деконструктора. Моя проблема в том, что у меня есть классы в отдельных пространствах имен, я использую чисто виртуальный класс в качестве базового класса для другого. Программа будет компилироваться, только если я возьму указатель на переменную 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);
}
Теги:
game-engine

3 ответа

2
Лучший ответ

Вы еще не указали определение функций, которые вы намерены переопределить. Например, вам нужно добавить:

void MyScene::create()
{
    std::cout << "Scene Created!" << std::endl;
}

Сделайте это для всех функций-членов.

void create() который вы написали, не принадлежит ни одному классу и является функцией, не являющейся членом в пространстве имен Game.

  • 0
    Я, очевидно, дурачок ... спасибо, я думаю, это доказывает, что пришло время ложиться спать. Добавление области видимости класса исправляет это ..
1

Причина, по которой вы получаете ошибку, - это такие определения, как: -

void create() {}

Вы должны использовать это в классе, например: -

void MyScene::create() {}

Пожалуйста, убедитесь, что вы делаете это для всех функций-членов.

Наряду с этим изменением определения обновления, чтобы принять аргумент.

0

Когда вы получаете класс из абстрактного класса, все абстрактные методы вашего абстрактного класса должны быть определены в вашем производном классе. Вы даже не определили метод. Когда вы определяете вне класса, используйте класс scope для определения методов и убедитесь, что вы переопределили все методы, которые являются абстрактными в вашем базовом классе.

Не забывайте, что это пустое обновление (double delta); не просто void update();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню