1

これに関する FAQ や他のいくつかの Web サイトを読みましたが、適切な解決策が見つからないようです。以前にこの質問を聞いたことがあると思います。可能であれば、これをどのように解決すればよいかについて、具体的な助けを求めたいと思います.

具体的なエラーは次のとおりです: エラー: `vtable for FGui' への未定義の参照 常に fgui.cpp のコンストラクターを指していますが、問題がある可能性はありません。

FGui は、QMainWindow から継承された「FFoo」という名前のクラスから継承されたクラスです。関連コード:

(ffoo.h 内:)

class Ffoo : public QMainWindow
{
Q_OBJECT
public:
    Ffoo();
    ~Ffoo();
    (...)
};

(ffoo.cpp:)

Ffoo::Ffoo()
{
    textEdit = 0;
    tcpSock = 0;
    setupConnectBox();
}

Ffoo::~Ffoo()
{}

最近クラスを作り始めたばかりなので、FGuiファイルはまだ非常に単純です。

(fgui.h:)

class FGui : public Ffoo
{
    Q_OBJECT
public:
    FGui();
    ~FGui();
};

(fgui.cpp:)

FGui::FGui() : Ffoo()
{}

FGui::~FGui()
{}

これを解決するために何をすべきか誰かが教えてくれたら、とても感謝しています。前もって感謝します。:)

4

5 に答える 5

6

qmake を再実行してみてください。Qt Creator を使用している場合は、プロジェクトをクリーン (Build/Clean All) してから、Build/Run qmake を選択します。これは、このような状況で役立つことがよくあります。

于 2011-02-01T16:26:29.197 に答える
4

ソースファイルに対してmocを実行する必要があります。.pro ファイルに .cpp および .h ファイルが含まれている限り、qmakeを使用してメイクファイルを作成した場合、これは自動的に行われます。これらの手順のいずれかを忘れている可能性があります。前回の qmake の実行時にクラスに Q_OBJECT マクロが含まれていなかった場合、単に make を実行しても moc が呼び出されないことに注意してください。そのためには、 qmake を再度実行する必要があります。

「make」を実行すると、.cpp ファイルがコンパイルされるだけでなく、追加の .cpp ファイルも moc (メタ オブジェクト コンパイラ) によって作成され、コンパイルされます。この 2 番目の .cpp ファイルには、シグナルの実装が含まれています。シグナルは、呼び出しを接続されたスロット (またはシグナル) に「転送」する、実際には通常のメソッドであることに注意してください。この実装は、moc が (特に) 生成するものです。クラスにシグナルが含まれていなくても、内部で使用される (?) 仮想関数のために、クラスには vtable が必要です。ただし、ソース ファイルに QObject ベースのクラスが含まれている場合は、moc を実行する必要があります。

于 2011-02-01T18:08:57.780 に答える
3

FGui および Ffoo クラスをモックする必要があります。

于 2011-02-01T16:20:33.950 に答える
2

これは通常、ソースファイルの開発の後半でQ_OBJECTマクロを追加するときに発生します。Makefileは、ファイルをモックする必要があるとはまだ考えていないため、モックしません。これらのvtableエラーが発生します。他の人が示しているように、qmakeを再実行するだけです。Creatorを使用している場合は、[ビルド]メニューの下にあります。

于 2011-02-01T21:13:48.477 に答える
2

vtable への未定義の参照は、純粋な仮想メソッドを実装していないことを意味します。FGuiに実装するのを忘れたFfooの純粋な仮想メソッドである可能性があります。または、シグナルを使用している場合は、他の人が述べているように、メタオブジェクトコンパイラ(不足しているメソッドを実装する)を使用していない可能性があります。

于 2011-02-01T17:05:27.840 に答える