【问题标题】:Q_OBJECT derived class, inheritanceQ_OBJECT 派生类,继承
【发布时间】:2016-01-30 18:25:24
【问题描述】:

我是 qt 的新手。 我有下一个继承:

class Poster : public QObject 
{
  Q_OBJECT
}

class SyncPoster: public Poster 
{
  Q_OBJECT

private slots:
  ... some functions

}

class TextPoster : public Poster
{

  Q_OBJECT

private slots:
   ... some functions

}

但是组装会引发以下错误:

架构 x86_64 的未定义符号:“vtable for SyncPoster”, 参考自: SyncPoster::SyncPoster(Window*, QString const&, QString const&, QString const&, QString const&) 在 sync_poster.o 注意:缺少 vtable 通常意味着第一个非内联虚成员函数具有 没有定义。 ld:未找到架构 x86_64 的符号

这是什么意思,我做错了什么?你有什么想法吗?

【问题讨论】:

    标签: qt qobject


    【解决方案1】:

    此错误的一个常见情况是,当您创建 QObject 派生类并在构建之前添加或删除 Q_OBJECT 时未调用 qmake。

    如果您刚刚添加了 Q_OBJECT,对 qmake 的缺失调用不会触发文件的重新解析,并且 moc 将不会运行。

    【讨论】:

      【解决方案2】:

      来自类似主题Why am I getting "Undefined symbols ... typeinfo ... vtable" with a virtual and concrete class?

      ...您似乎将定义与声明混淆了。你有什么 在基类中只是没有定义的声明,即 执行。您要么需要使其成为纯虚拟的,要么需要实现 即使它只是一个空的 {}...

      检查构造函数的声明和定义。你的SyncPoster有公共构造函数吗?它有定义吗? (有身体吗?)

      SyncPoster::SyncPoster(/*...*/)
      

      检查是否有body:

      SyncPoster::SyncPoster(/*...*/) {}
                                    //^^^  body
      

      【讨论】:

      • 我有所有的类在头文件中有 Q_OBJECT 宏。我已经编辑了问题
      • 我能从中看出什么?
      • 检查是否有没有定义的声明
      • 我检查了所有方法,似乎没问题。实际上我只是重建了一段时间我的项目,现在一切都很好。似乎只是 IDE 缓存错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      相关资源
      最近更新 更多