問題タブ [vtable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - vtable への未定義の参照 - 仮想メンバー、gsoap によって生成されたクラス
ツール wsdl2h および soapcpp2 を使用した gsoap は、以下を含む soapStub.h ファイルを提供してくれました。
このクラスを使用して、Informix DB からのデータをオブジェクトに取り込む小さなアプリから始めます。
しかし、正常にコンパイルするには、すべての仮想のものを残す必要があります-このエラーとサブクラスでの仮想メンバーの使用に関する多くの投稿を見つけました-そうしないと、
何年にもわたるスクリプト作成の後で、C++ コードを理解するのが非常に難しいことだけは認めます... 次に何を試すべきかアドバイスを求めたいと思います。私のクラスは派生クラスではありません。たとえば、不思議に思うのはそのためです。
c++ - 仮想継承でコンストラクターを呼び出すのは誰ですか?
仮想継承の場合ではなく、コンストラクターを呼び出すのはほとんどの派生クラスの責任ですか? 注: ここで base は仮想的かつプライベートに継承されます。
c++ - 基本クラスのオブジェクトに対する派生クラスのメソッドの呼び出し
コンパイルすべきではないと思われる数行のコードを書きました。次のように、基本クラスのオブジェクトへの static_cast-ed ポインターで派生クラスのメソッドを呼び出しています。
出力された値は明らかにがらくたですが、これはコンパイルする必要がありますか? どうgcc
やってそれを行うことができますか?
c++ - 完全な純粋仮想クラスの vtable 配置
C++ 仕様に関する私の (限られた) 知識によると、仮想メンバーを持つクラスの vtable は、最初の非純粋な非インライン仮想メソッドの定義に配置されます。コンパイラは、すべての純粋仮想メソッド (インターフェイスなど) を継承するクラスをどのように処理しますか? この場合、vtable はどこに配置されますか?
c++ - 仮想関数を使用してクラスのsizeofを決定する方法は?
これは一種の宿題の質問です。次のコードの場合、
出力は次のとおりです。8
誰かがそれが8バイトである方法を説明できますか?vtableの実装がコンパイラに依存している場合、インタビューでこの種の質問に答える必要がありますか?仮想基本クラスはどうですか?
編集:私は32ビットプラットフォームで作業しています。
c++ - Q_OBJECT が「vtable への未定義の参照」エラーをスローする
Windows 7 Ultimate 32 ビットで Qt Creator 2.0.1 と Qt 4.7.0 (32 ビット) を使用しています。
エラーを生成するための最小限の次のコードを検討してください。
上記のコード フラグメントにより、次のリンカ エラーが発生します。
関数 `T' では:
「T の vtable」への未定義の参照
「T の vtable」への未定義の参照
関数 `~T' では:
「T の vtable」への未定義の参照
「T の vtable」への未定義の参照
を含む行をコメントアウトすると、正常にQ_OBJECT
コンパイルされます。シグナルとスロットがQGraphicsItem
必要なので、 が必要Q_OBJECT
です。
コードの何が問題になっていますか? ありがとう。
c++ - 仮想関数を使用したVS2010での__purecallの問題 - メソッドがpurecallを取得すると
私は非常に奇妙な問題を抱えています:
基本クラスの 1 つである IEventlistener() を使用します。これは、他の多くのクラスによって実装されます。ほとんどの場合、システムは機能します。しかし今、非常に奇妙な問題が発生しました。
クラス (CGUIService) がインターフェイスを実装すると、1 つのメソッド (VGetListenerName) が期待どおりに機能し、コールスタックをチェックすると、もう 1 つのメソッド (VHandleMessage) が純粋な呼び出しを取得し、理由がわかりません -.- (vtable が何らかの形で取得されるようです)上書きまたは範囲外 ...)
VHandleMessage を呼び出す前に変数を確認できるように、スクリーンショットを作成しました。これはもちろん、デバッグ アサーション R6025 につながります。これは、実装されたメソッドが IEventlistener() の vtable に入力されていないためです。
ハイレゾ: www.fantasyhaze.com/cb/Error_purecall.png
誰かが私にヒントをくれることを願っています:)
編集1.)
もう少し説明するために、同じプロセスを示す新しいスクリーンショットを作成しましたが、純粋ではなく、実装されている 2 つの仮想関数を追加しました (時間の理由により、時間がありません)。インターフェイスを使用する各クラスですべてのメソッドを再度実装します)
紫色のものは新しいものです。赤色のものは機能しないものです。オレンジ色のものは以前に存在し、機能し、現在も機能している方法です。
左側で、VGetListenerName、VHandleEvent1、VHandleEvent2 が機能し (デバッグポイント + 現在の位置)、これら 3 つが vtable にあることがわかりますが、重要なもの (赤) ではありません。
高解像度: www.fantasyhaze.com/cb/Error_purecall2.png
編集2.)
解決:
主な問題は、CGUIService が IBase から継承することでした。サービスにアクセスするには、各サービスを格納する Service Locator を使用しました。そのため、Instance Getters Service::GetServiceInstance() で static_cast を実行し、サービスを IBase として格納するために static_cast も実行されました。しかし、IEventListener は IBase に実装されておらず、サービスは IEventListener なしで IBase にキャストバックされ、vtable は適切ではありませんでした。現在、IBase は IEventListener を実装しており、static_cast が IEventListener を正しくキャストするため、機能します :)
ヒントの人のためのThx :)
c++ - 「vtable への未定義の参照」エラーを適切に解決するにはどうすればよいですか?
これに関する FAQ や他のいくつかの Web サイトを読みましたが、適切な解決策が見つからないようです。以前にこの質問を聞いたことがあると思います。可能であれば、これをどのように解決すればよいかについて、具体的な助けを求めたいと思います.
具体的なエラーは次のとおりです: エラー: `vtable for FGui' への未定義の参照 常に fgui.cpp のコンストラクターを指していますが、問題がある可能性はありません。
FGui は、QMainWindow から継承された「FFoo」という名前のクラスから継承されたクラスです。関連コード:
(ffoo.h 内:)
(ffoo.cpp:)
最近クラスを作り始めたばかりなので、FGuiファイルはまだ非常に単純です。
(fgui.h:)
(fgui.cpp:)
これを解決するために何をすべきか誰かが教えてくれたら、とても感謝しています。前もって感謝します。:)
c++ - C++ クラスをエクスポートする DLL で遅延ロードを使用する方法
からエクスポートされone.dll
たクラスを使用するDLL があります。forを使用したいのですが、リンク エラーが発生します。TwoClass
two.dll
class __declspec(dllexport)
one.dll
/delayload
two.dll
これはリリース ビルドです。デバッグビルドでは機能します。(vtable エクスポートに関して、Release と Debug の違いが何であるかはわかりません。また、それを制御するためのコンパイラ スイッチやプラグマも見つかりません。)
/delayload
このようなクラスをリリース ビルドでエクスポートする DLLを使用するにはどうすればよいですか?
c++ - 位置に依存しないコードとvtable
仮想関数は位置に依存しないコードでどのように実装されますか?
クラスに仮想関数がある場合、コンパイラは通常、すべての仮想関数のアドレスを含むvtableを生成し、クラスの各オブジェクトにvtableへのポインタを格納することを知っています。
さて、私のコードが位置に依存しない場合、コンパイラーは仮想関数(または、さらに言えば、任意の関数)のアドレスを知ることができません。それで、それは何をしますか?
実際のコンパイラが何をするのか知りたいです(理論的に可能なことではありません)。私は主にLinux32ビットプラットフォームに興味がありますが、他のプラットフォームも少し興味深いものです。