QTサブクラスのvtableの `への参照を未定義

1.コンソールプロジェクトを作成します。

QT - = GUIの

CONFIG + = C ++ 11 のコンソール
CONFIG - = app_bundle 

#次定義するには、コンパイラが警告を発光させる場合は、使用
位にはQtのいずれかの機能は非推奨とマークされて(正確な警告
#は、コンパイラに依存します)。ドキュメントを参照してください
#をAPIの非推奨どのようにポートあなたのコード離れてそれから知るため。
DEFINES + = QT_DEPRECATED_WARNINGS 
#あなたはまた、可能にするあなたのコードがコンパイルに失敗した場合、あなたが推奨されないAPIを使用しています。
するために#やります
そう、次の行のコメントを解除。
#またできる選択のみのQtの特定のバージョンまでは推奨されないAPIを無効にします。
#define + = QT_DISABLE_DEPRECATED_BEFORE = 0x060000     #Qtの前に廃止予定のすべてのAPI無効に6.0を0 

SOURCES + = \ 
        メイン。CPP \の
    基底クラス。CPP \の
    サブクラス。CPP 

#デフォルトルールのために展開。
QNX:target.path =を/ tmp / $$ {TARGET} / binに
 他の UNIX:!アンドロイド:target.path =は/ opt / $$ {TARGET} / binに
!のisEmpty(target.path):インストール+ = ターゲット

HEADERS + = \ 
    baseclass.h \ 
    subclass.h

2.基底クラスを追加します。

baseclass.h

#ifndefのBASECLASS_H
 の#define BASECLASS_H 

の#include " QObjectを" 

クラス基底クラス:パブリックQObjectを
{ 
    Q_OBJECTの

公共
    基底クラス(QObjectを * P = 0 )。
    仮想基底クラス(){} 

シグナル:
    ボイドSIGNAL1(); 


}。

#endifの // BASECLASS_H

baseClass.cpp

#include " baseclass.h " 

基底クラス::基底クラス(QObjectをする *のP):QObjectを(P)
{ 

}

subclass.h

#ifndefのSUBCLASS_H
 の#define SUBCLASS_H 

の#include " baseclass.h " 

クラスのサブクラス:公共基底クラス
{ 
    Q_OBJECTの

公共
    サブクラス(QObjectを * P = 0 )。
    仮想サブクラス(){}。

// シグナル:
    無効SIGNAL2(); 

}。

#endifの // SUBCLASS_H

subclass.cpp

#include " subclass.h " 

サブクラス::サブクラス(QObjectをする *のP):基底クラス(P)
{ 

}

main.cppに

#include <QCoreApplication> 
の#include " subclass.h " 

int型のmain(int型 ARGC、CHAR * ARGV [])
{ 
    QCoreApplication(ARGC、ARGV)。


    サブクラス *サブ= 新しいサブクラス(); 

    戻るa.exec(); 
}

 

 

コンパイルエラー:

testQtSignalBug /サブクラス。CPP14:エラー:vtableの`の未定義の参照のためのサブクラス
エラー:collect2はldは返さ1つの終了ステータスを

 

ソリューション:マクロQ_OBJECTでsubclass.hをコメントアウト

理由:不明

 

おすすめ

転載: www.cnblogs.com/crazyghostvon/p/vtable_for_subClass.html