C++ 未定义对“虚拟类的 vtable ”的引用

c++ undefined reference to `vtable with virtual classes

本文关键字:虚拟类的 vtable 引用 未定义 虚拟 C++      更新时间:2023-10-16

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

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

#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

----- 我的场景-----

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

-----我的场景.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);
}

您尚未提供要重写的函数的定义。例如,您需要添加:

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

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

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

您收到错误的原因是以下定义:

void create() {}

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

void MyScene::create() {}

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

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

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

不要忘记,它是 void update(双增量); 不是简单的 void update();