c ++ undefined对`vtable with virtual classes的引用

时间:2014-11-14 06:41:50

标签: c++ game-engine

我为解决这个问题而阅读的每个建议都说要为解构函数创建一个主体,但是,我提供了自己的解构函数。我的问题是这个,我在不同的命名空间中有类,我使用纯虚拟类作为另一个的基类。只有在我指向MyScene变量的指针时,程序才会编译。我需要传递对Engine :: Engine :: run()的引用,否则我会遇到分段错误。

------基类------

#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 */

-----主要功能-------

#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);
}

3 个答案:

答案 0 :(得分:2)

您尚未提供要覆盖的功能定义。例如,您需要添加:

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

为所有成员函数执行此操作。

您编写的

void create()不属于任何类,并且是Game命名空间内的非成员函数。

答案 1 :(得分:1)

您收到错误的原因是: -

void create() {}

你应该在类范围内使用它,如: -

void MyScene::create() {}

请确保您为所有会员功能执行此操作。

随着更新的更改定义接受参数。

答案 2 :(得分:0)

从抽象类派生类时,应在派生类中定义抽象类的所有抽象方法。你甚至没有定义一个方法。在类外定义时,使用类作用域定义方法,并确保已覆盖基类中所有抽象的方法。

别忘了,它是无效更新(双三角);不仅仅是void update();