【问题标题】:How can my class inherit an interface and QObject ?我的类如何继承接口和 QObject ?
【发布时间】:2017-02-24 19:06:16
【问题描述】:

我有这个界面:

class ISocketClient
{
public:
  ~ISocketClient() {}
  virtual bool      connectToHost(std::string const &hostname, unsigned short port) = 0;
  virtual void      closeClient() = 0;
  virtual bool      sendMessage(Message &) = 0;
  virtual Message   *getMessage() = 0;
};

这是我继承的类:

class TCPClient : public  QObject, ISocketClient
{
  Q_OBJECT

public:
  TCPClient(QObject *parent = 0);
  ~TCPClient();
  bool connectToHost(std::string const &hostname, unsigned short port);
  void closeClient();
  bool sendMessage(Message &);
  Message *getMessage();
public slots:
  void readMessage();
private:
  QTcpSocket *tcpSocket;
};

但是当我编译时出现这个错误:

/home/danilo_d/Epitech-Projects/Semestre5/QtNetworkTest/TCPClient.cpp:4: error: undefined reference to `vtable for TCPClient'

当我取出 QObject 的继承时,它就起作用了。

知道我该怎么做吗?

【问题讨论】:

  • 你能显示TCPClient.cpp吗?
  • 我想你想要:class TCPClient : public QObject, public ISocketClient,反正~ISocketClient() {} 应该是虚拟的
  • @user3528438 真的吗?这不是我阅读Multiple Inheritance Requires QObject to Be First 要求的方式。
  • @user3528438 只要ISocketClient不是继承自QObject,并且QObject是第一个base就可以了

标签: c++ qt inheritance


【解决方案1】:

这可能是因为您没有在构建中包含.moc 文件。有关类似问题,请参阅 Qt Linker Error: "undefined reference to vtable",不过,如果您的构建系统未知,则想法是:

a) 您需要确保在您的 .cpp 文件上运行 moc 并且

b) 生成的 .cpp 文件包含在构建中。

具体如何完成取决于构建系统。例如,在我当前的项目中,使用 Cmake 3.x.x,这个命令就足够了:

set (CMAKE_INCLUDE_CURRENT_DIR ON)
set (CMAKE_AUTOMOC ON)

对于 GNU make,下面是一个示例:

http://doc.qt.io/qt-4.8/moc.html#writing-make-rules-for-invoking-moc

对于qmake,参见例如

Why is important to include ".moc" file at end of a Qt Source code file?

对于多重继承,如果要继承多个QObject,则不允许这样做。相反,当有一个 QObject 和多个“常规”类时,效果很好。

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    相关资源
    最近更新 更多