You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:35:22