Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ vtables出现了奇怪的错误_C++_Qt_Opengl_Inheritance_Qt5 - Fatal编程技术网

C++ vtables出现了奇怪的错误

C++ vtables出现了奇怪的错误,c++,qt,opengl,inheritance,qt5,C++,Qt,Opengl,Inheritance,Qt5,我正在将代码从以前的API(SDL)移动到Qt5.4。我有几个与Qt无关的类,在CodeBlocks/visualstudio上工作得很好。在我的代码中: void ModelLoader::processNode(aiNode *node, const aiScene *scene, vector<Mesh> &mesh) { for (unsigned int i = 0; i < node->mNumMeshes; i++) {

我正在将代码从以前的API(SDL)移动到Qt5.4。我有几个与Qt无关的类,在CodeBlocks/visualstudio上工作得很好。在我的代码中:

void ModelLoader::processNode(aiNode *node, const aiScene *scene, vector<Mesh> &mesh)
{
    for (unsigned int i = 0; i < node->mNumMeshes; i++)
    {
        aiMesh *me = scene->mMeshes[node->mMeshes[i]];
        Mesh tmesh = processMesh(me, scene);
        mesh.push_back(tmesh); // Won't let me push back!
    }
    for (unsigned int i = 0; i < node->mNumChildren; i++)
    {
        processNode(node->mChildren[i], scene, mesh);
    }
}
这就是令人困惑的地方:我根本不是从这个类继承的!但是,我必须承认,我可以理解为什么它会这样说。你看,类“Mesh”以及其他类,如纹理等:它们都继承自QOpenGLFunctions_4_3_Core,它们需要继承,因为它们必须使用OpenGL的函数。我不想创建指向上述类的指针,因为这样会降低代码的可读性。我在从它继承的任何类的构造函数中初始化penglFunctions()。我还在Mesh类中实现了虚拟析构函数,因为我从以前的经验中知道,vtable错误通常也会从类似的责备中派生出来

既然这段代码在另一个IDE上运行得很好,为什么Qt创建者会因为上面提到的错误而抱怨呢?当然,它确实与QoPenglFunction有关。具有讽刺意味的是,所有继承自该类的类都可以正常编译;如果省略ModelLoader,那么代码编译和运行时不会发生任何崩溃

我已设法将问题隔离到上述函数中;从我的发现来看,导致最大问题的代码行是当我推回临时网格时,它是processMesh(..)返回网格的结果。这段代码在代码块下运行良好,但在Qt Creator下运行不好。这是非常令人沮丧的,因为它就像Qt希望我采用它想要的编程风格一样,但我不知道为什么会在这里产生这个错误,为什么它与这个叫做QAbstractOpenGL的东西有关。(到目前为止我见过的最长的类名,真的)

乍一看,它可能与Mesh类有关,因为它继承自QOpenGLFunctions_4_3_核心。如果我注释掉Mesh构造函数中的所有内容(包括所述类的初始化func),那么仍然会得到相同的错误


我需要其他人的意见,最好是那些熟悉Qt及其与OpenGL通信方式的人的意见。为什么这个错误发生在Qt Creator上而不是其他IDE上?Qt在这里要求什么?

许多编译器将
vtable
符号与析构函数一起发出(如果析构函数不存在或不虚拟,则发出第一个虚拟函数)。因此,当您未能在项目(链接)中包含给定的相应
.cpp
文件时,就会发生未定义的vtable错误。或者如果此文件缺少某些成员函数。因此,请检查您是否正在连接
ModelLoader.cpp
,并且没有未实现的函数。当然还有
Q\u对象
vodoo。你说的Q\u对象vodoo是什么意思?这种
对vtable
错误的未定义引用通常意味着一件事:你声明了一些你没有实现的虚拟方法
Q_对象
主要是这样做的:声明一些
moc
实现的虚拟方法(因此
moc
未运行=>错误)。你能粘贴你的类的定义吗?哪个类持有指向某种
QOpenGLFunctions
东西的指针?该类正在被复制。问题是您正在复制Mesh,因此也要求其QOpenGLFunctions基进行复制。但是这个类不能被复制。如果要复制,请使用成员(而不是继承)。或重新组织代码(即从管理这些网格数据的逻辑中拆分“网格数据”,即原始缓冲区和属性等)
ModelLoader.o:-1: In function `QAbstractOpenGLFunctions::QAbstractOpenGLFunctions(QAbstractOpenGLFunctions const&)':

error: undefined reference to `vtable for QAbstractOpenGLFunctions'

:-1: error: collect2: error: ld returned 1 exit status