「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ コードで「vtable」および「typeinfo」の未定義シンボル エラーが発生するのはなぜですか?

C++ コードで「vtable」および「typeinfo」の未定義シンボル エラーが発生するのはなぜですか?

2024 年 11 月 8 日に公開
ブラウズ:282

Why Am I Getting \

未定義のシンボル: "vtable" および "typeinfo"

提供されたコードでは、リンク エラーが発生し、次のメッセージが表示されます。

Undefined symbols:
  "vtable for Obstacle", referenced from:
      Obstacle::Obstacle()in Myworld.o
  "typeinfo for Obstacle", referenced from:
      typeinfo for RECTANGLEin RECTANGLE.o
      typeinfo for CIRCLEin CIRCLE.o

「vtable」と「typeinfo」について

  • vtable (仮想メソッド テーブル): A データクラスの仮想メソッドへのポインタを格納するためにコンパイラによって使用される構造体。これにより、派生クラスのオブジェクトが仮想メソッドの正しい実装を呼び出すことができます。
  • typeinfo (実行時型情報): オブジェクトのメモリに格納されている、オブジェクトの型を識別する情報。これにより、動的な型チェックとポリモーフィックな動作が可能になります。

エラーの解決

このエラーの根本原因は、抽象基本クラス Obstacle に非-純粋な仮想関数。クラスが純粋仮想関数 (virtual void Method() = 0;) を宣言すると、派生クラスが実装をオーバーライドする必要があることを意味します。

Obstacle で非純粋仮想関数を定義した場合、コンパイラーはは、その実装が基本クラスまたは派生クラスのいずれかで見つかることを期待します。ただし、これらの実装が提供されていない場合、コンパイラはそれらの関数に依存する内部構造 (vtable および typeinfo) を生成します。リンク時に、欠落している関数により未定義シンボル エラーが発生します。

解決策

この問題を解決するには、抽象基本クラス Obstacle 内のすべての仮想メソッドが宣言されていることを確認してください。純粋な仮想関数として。これにより、派生クラスはこれらのメソッドをオーバーライドして実装するようになります。そうすることで、正しい仮想メソッドの実装が提供され、未定義のシンボル エラーが発生することなくリンク プロセスが成功するはずです。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3