2016-04-16 9 views
1

私はこのように、C#のインターフェイスを模倣しようとするために使用するC++クラスがあります。これはリリースに罰金コンパイル大型のQt C++プロジェクトからですが、ときに私、私はこのエラーを得たvtableへの未定義参照はどこにありますか?

class Foo { 
public: 
    virtual void baa(); 
} 

を私はどのようなこと、エラー手段を知っている

をvtableのために

未定義の参照:デバッグモードでコンパイル :仮想メソッドが定義されていませんでした。私の質問は次のとおりです:

これは、デバッグ時にのみ発生し、なぜわかりません。そのメソッドを定義していないソース(つまりクラス)を見つけることはできますか?

Qt自体、コンパイラオプション、外部ツールなどを使用したいと思います。

+0

あなたはどちらのコンパイラを使用していますか?デバッグとリリースで使用したコンパイラコマンドを投稿できますか? – CodeMouse92

+0

通常、これは 'virtual'関数を宣言したが、ボディを提供しなかったことを意味します。すべての仮想関数は、純粋な仮想関数を除き、本体を持たなければなりません。たとえ彼らが呼ばれなくても。 –

+0

@ M.Mでは、すべての 'virtual'メソッドのボディを正確に持つことは良いことですが、そのクラスのオブジェクトがインスタンス化されているメソッドボディのみが必要です。例えば、私が 'class B'とその派生した' class D'を持っているとします。 'B'のオブジェクトを作成せずに' virtual void f(); 'を呼び出すと、未定義の' virtual'メソッドでまだ生きています。ところで、純粋な '仮想 'メソッドの場合、本体が必須ではないにもかかわらず、依然としてクラス本体の外側で定義することができます。 – iammilind

答えて

1

は私にとって

最初の容疑者がclass Fooそのものだろう「私はソース(すなわち、クラス)私はそのメソッドを定義していないいるを見つけることができます」。それにvoid baa()という定義が含まれているかどうかを確認してください。 Foo::baa()が定義されていない場合は、以下のような何かをすることはできません。

Foo foo; 
foo.baa(); // undefined reference for `Foo::baa()` 

を今、あなたが実際にFoo::baa()を定義している場合は、おそらくこのエラーはFoo(他のいくつかのサブクラスのために来ているしかし、私は、gがどのサブクラスを言及++ことに気付きますなぜそれがあなたに見えないのか不思議です)。

class Foo1 : public Foo 

一つの簡単な方法は、一時的にFoo::baavirtual純粋ようにすることです。

class Foo { 
public: virtual void baa() = 0; 
}; 

そのような場合、このメソッドをオーバーライドしていないサブクラスは、コンパイラエラーを生成します。これは、行番号等のためにあなたの発見が楽になります。

DEBUGモードでリンカーエラーが発生する理由は、かなり主観的であり、より多くの情報が必要です。

関連する問題