我的类如何继承接口和QObject

How can my class inherit an interface and QObject ?

本文关键字:接口 QObject 继承 何继承 我的      更新时间:2023-10-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;
};

我的类继承了is

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的继承时,它工作了。

你知道我该怎么做吗?

这可能是因为您没有在构建中包含.moc文件。请参阅Qt链接器错误:对vtable的未定义引用;对于类似的问题,假设您的构建系统是未知的,那么思路是:

a)您需要确保moc在您的.cpp文件和

上运行

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,参见示例

为什么包含".moc"文件在Qt源代码文件结束?

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