1

この奇妙な質問で立ち往生

次のコードが g++ で問題ない理由

#include <QObject>

class B {
public:
  B(){}
  ~B(){}
};

class A : public QObject, public B {
  Q_OBJECT
public:
  A(QObject * parent = 0 ) : QObject( parent ), B() {}
  ~A(){}
};

int main(int argc, char *argv[])
{
  A a1();
  //A * a = new A();
  //delete a;
  return 0;
}

これはコンパイルできません

/*... the same class definitions as above */    

int main(int argc, char *argv[])
{
  //A a1();
  A * a = new A();
  delete a;
  return 0;
}

//error: undefined reference to `vtable for A'

2番目も良くするために何をすべきかということですか?

PSまあ、すべてを別々のファイルに入れましたが、正常に動作します。Q_OBJECT マクロの問題だと思います。

4

3 に答える 3

3

最初の例ではコンパイルとリンクが正常に行われるのに、2 番目の例ではそうでないのはなぜですか?

最初の例がコンパイルおよびリンク
される理由は次のとおりですA

A a1();

a1()パラメータを取らず、型を返す関数を宣言しますA

new2 番目の例では、が呼び出されたときにオブジェクトを作成します。

vtable for A'* is a linking error and will only be emitted when a object ofクラス A`への *undefined 参照が作成されることに注意してください。したがって、2 番目の例のみがエラーを示しています。

問題を解決するには?
から派生するすべての仮想関数の定義を提供する必要がありますQObject

于 2012-03-10T05:48:19.330 に答える
3

QObject 派生クラスを定義し、アプリケーションを構築し、Q_OBJECT マクロを追加するのを忘れていて、後で追加したことに気付いた場合は、qmake で Makefile を明示的に更新することが重要です。さらに、安全のために、古いファイルを削除するためにクリーンにすることをお勧めします。make は、そのような状況で生成されたすべてのファイルをクリーンアップするほどスマートではありません。これは、新しい Qt 開発者にとってしばしば頭痛の種となる問題です。

このエラー メッセージの詳細については、次を参照してください。

http://cartan.cas.suffolk.edu/oopdocbook/html/commonlinkererrors.html#undefinedreftovtable

于 2012-03-10T05:50:37.013 に答える
0

コードはVisで機能します。スタジオ。あなたの問題はそれBがポリモーフィッククラスではないかもしれません-なぜそれがあなたにエラーを与えるのか分かりません-しかしあなたはB仮想で何かを作ってみることができます:virtual ~B(){}例えば。

于 2012-03-10T05:53:28.273 に答える