C++ C++;-对“vtable”的未定义引用

C++ C++;-对“vtable”的未定义引用,c++,qt,C++,Qt,我想知道为什么会出现这样的错误: 对“vtable for BaseRenderer”的未定义引用 我试着四处寻找,但似乎无法找到答案。我试着去掉虚函数,删除构造函数,等等 我的棒球手 class BaseRenderer : public Renderer { Q_OBJECT public: BaseRenderer(); BaseRenderer(QWidget *parent); void paintGL();

我想知道为什么会出现这样的错误: 对“vtable for BaseRenderer”的未定义引用

我试着四处寻找,但似乎无法找到答案。我试着去掉虚函数,删除构造函数,等等

我的棒球手

class BaseRenderer : public Renderer
{
 Q_OBJECT

    public:
        BaseRenderer();
        BaseRenderer(QWidget *parent);
        void paintGL();

        virtual ~BaseRenderer();

 public slots:
  void loadDialog();

 signals:

    protected:
        Mesh loadMesh(string fileName);

    private:

        OBJParser objParser;
        Mesh baseTerrain;

};
我的BaseRender.cpp

BaseRenderer::BaseRenderer()              <------ Error leads me here
{
}

BaseRenderer::BaseRenderer(QWidget *parent) : Renderer(parent)
{

}

BaseRenderer::~BaseRenderer()
{
    //dtor
}

BaseRenderer::BaseRenderer()我认为这条毫无帮助的消息实际上是在抱怨您没有为
BaseRenderer
类中的其他函数提供定义,作为您的<代码> BaseEnter。CPP < /C>文件似乎只有构造函数和析构函数。

< P>参见'C++ FAQLite .< /P>< P> >确保您实现了所有声明的方法,特别是槽。然后检查您的头是否列在.pro文件的HEADERS部分中,然后运行qmake。

因为Q_对象位于父类Renderer中,所以您不必同时包含它BaseRenderer。只要去掉Q_对象,它就会工作:)

我想这和我问这个问题时遇到的问题是一样的:


试着像paxdiablo和Tobias建议的那样重新运行qmake。

传递给编译器的参数是什么?@John-这是一个Qt宏,这意味着这个源文件必须通过一个单独的Qt工具(
moc.exe
)来运行,才能为特定于Qt的行为(如插槽和信号)生成一系列代码。@Birrree:Ah。我对Qt一点也不熟悉,所以我会退出这一步,或者,如果你使用qmake,它会在你的makefile中为你生成moc命令。检查你的头是否列在.pro文件的HEADERS部分。它对我有效。你能详细说明为什么移除Q_对象可以解决这个问题吗?我从QWidget中创建了一个子类,如果在子类中添加插槽,这是行不通的。另请参见,例如,一些文档(在此网站上搜索)建议
Q_对象
应始终存在于
QObject
直接或间接子类中。