2016-10-15 13 views
0

私は、このインターフェイスがあります。私のクラスはどのようにインターフェイスとQObjectを継承できますか?

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の継承を、それは動作します。

どうすればいいですか?

+1

あなたは 'TCPClient.cpp'を表示できますか? –

+0

私はあなたが望むと思います: 'class TCPClient:public QObject、public ISocketClient'、とにかく'〜ISocketClient(){} 'は仮想でなければなりません – Danh

+0

@ user3528438本当ですか?それは私が[Multiple Inheritance Requires QObject To First](http://doc.qt.io/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-first)の要件をどのように読んでいるかではありません。 –

答えて

1

これはおそらく、あなたが.mocファイルをビルドに含めていないためです。 、ビルドシステムが不明であることを提供するものの、同様の問題のためQt Linker Error: "undefined reference to vtable"を参照してください、という考えは、次のとおりです。

A)あなたが)あなたの.cppファイルと

B上で実行されたことをされていることを確認mocを作成する必要が生じました.cppファイルがビルドに含まれています。

どのように行われているかは、ビルドシステムによって異なります。例えば、私の現在のプロジェクトで、cmakeのの3.xxので、このコマンドは十分です:GNU makeについては

set (CMAKE_INCLUDE_CURRENT_DIR ON) 
set (CMAKE_AUTOMOC ON) 

、ここでそれを行うことができる方法の例です:

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と複数の "従来の"クラスがある場合は、うまく動作します。

関連する問題