继承QObject后无法使用connect,出现vtable未定义错误
解决Qt中
undefined reference to vtable for GameModel错误 1. 修复代码语法错误
你的generateEnergy实现末尾多了一个冗余的大括号,这会导致编译失败,进而阻碍元对象代码生成:
// 错误代码 void GameModel::generateEnergy() { Energy newEnergy("NewEnergy"); addEnergy(newEnergy); } } // 多余的大括号,需删除
修正后:
void GameModel::generateEnergy() { Energy newEnergy("NewEnergy"); addEnergy(newEnergy); }
2. 重新运行qmake
添加Q_OBJECT宏后,Qt的moc工具需要生成对应元对象代码。若未重新运行qmake,编译器找不到生成的moc文件,就会触发vtable错误:
- 在Qt Creator中点击菜单栏
构建->重新运行qmake - 之后重新编译整个项目
3. 检查moc文件编译状态
确认moc_gamemodel.cpp已生成并被纳入编译:
- 查看项目构建目录(debug/release文件夹)下是否存在该文件
- 若未生成,删除整个构建目录,重新运行qmake并编译
4. 调整析构函数定义
你使用的~GameModel() = default;在部分Qt版本中可能干扰元对象系统生成vtable,可改为显式定义:
// 头文件 ~GameModel(); // 实现文件 GameModel::~GameModel() { delete energyTimer; delete energySources; }
同时显式定义还能避免指针成员的内存泄漏。
5. 验证.pro项目配置
确保项目文件包含必要模块与正确的文件路径:
QT += core SOURCES += \ main.cpp \ gamemodel.cpp HEADERS += \ gamemodel.h
内容的提问来源于stack exchange,提问作者Alcky26
相关产品推荐
相关产品推荐

