問題タブ [member-function-pointers]
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++ - 非静的メンバー関数を使用した C++ ソート ベクトル
というクラスがありSorter
ます。2 つのパブリック アイテムがあります。
int
タイプ変数choice
- 2 つのオブジェクトをパラメーターとして受け入れる型の戻り値で呼び出さ
compare
れるメンバー関数。int
コンストラクタに値をSorter
渡して whileのインスタンスを作ってみたところ、choice
次に、C++sort
関数を使用してvector
. compare
作成したインスタンスのメンバー関数を渡します。
compare
メンバー関数は、変数を使用しchoice
て並べ替えメカニズムを決定します。
compare
しかし、 のインスタンスのメンバ関数へのポインタを取得できませんでしたSorter
。
誰かがこれについて私にアドバイスできますか?
c++ - 実行時の機能の表示と使用
クラスの機能 (メンバー関数) を公開セクションで公開せずに外の世界に提示したいと考えています。そのため、ユーザーはその機能を動的に知る/呼び出すことができます。以下にいくつかの方法を示します。
a) メンバー関数へのポインターを提供します。関数の名前を保持する文字列を伴う構造体で提供されるポインター。
b) 関数名の文字列リストと、指定されたメンバー関数を呼び出す文字列パラメーターを受け取る関数を提供します。
質問:どちらの方法がより効率的ですか? より良いアプローチはありますか?車輪を再発明していますか(boost::function?)?
注:
* IParameter は、一般的/自明なデータを保持するように設計されたクラスであり、各関数はそれを解釈する方法を知っています。
* すべての関数のシグネチャは同じです:
ありがとう
c++ - 同じオブジェクトのメンバー関数へのC++関数ポインターの割り当て
test.calculateの関数ポインター割り当て(およびおそらく残り)を機能させるにはどうすればよいですか?
c++ - C++ : メンバ関数ポインタを使用して関数仮想 'アドレス' を取得する
この質問は、仮想メンバー関数の印刷アドレスに似てい ます
メンバー関数ポインターを使用して、(実行時に) 関数のメモリ位置を取得したいと思います。目標は、それらをログに記録し、事後分析を行い、WinDbg で「ln」を使用して、PDB シンボルを使用してどの関数であったかを取得することです。
ログに記録したい関数にまだ慣れていないため、スタック ウォーキングを使用できません。(そして、何十億もの関数を変更してアドレスを返すことはしたくありません...)。
短いサンプル:
アドレスを取得する方法を知っている人はいますか?
「エラー C2298: '&' : メンバー関数式へのポインターに対する不正な操作」を与える
メンバー関数ポインターが「奇妙な」構造であることは知っていますが、「これ」を知っているので、潜在的に仮想関数を vtable から検索する方法はありますか?
よろしく、
参照:
c++ - C ++:仮想メンバー関数の単相バージョンへのポインター?
C ++では、クラスの(非静的)メンバー関数へのポインターを取得し、後でそれをオブジェクトで呼び出すことができます。関数が仮想の場合、呼び出しはオブジェクトの動的タイプに応じて動的にディスパッチされます。使用するバージョンを含むスコープを明示的に指定することにより、(メンバーポインターを使用せずに)オブジェクトの仮想メンバー関数を単相的に呼び出すこともできます。次のコードはこれを示しています。
私がやりたいのは、2つを組み合わせて、メンバー関数の単相バージョンへのポインターを取得することです。つまり、Foo :: fooへのポインタが必要です。これは、常にfooの基本クラスバージョンを呼び出し、Foo2で呼び出された場合でも1を出力します。しかし、私はこれを行う方法を見つけることができませんでした。出来ますか?
(単相呼び出しを行う新しい非仮想関数を手動で記述し、それへのポインターを取得するという面倒な手動の方法を除きます。)
c++ - メンバー関数の戻り値の型でパラメーター化されたクラス テンプレートの部分的な特殊化
メンバー関数ポインター型の戻り値の型に基づいて、クラス テンプレート 'special' を特殊化しようとする次のコードは、VC9 でコンパイル エラーになります。
エラー C2752: 'special': 複数の部分的な特殊化がテンプレート引数リストと一致します
http://ideone.com/ekWGg で示されているように、同じコードが GCC-4.3.4 で受け入れられて
います。
ただし、私は恐ろしく煩わしい回避策を考え出しました(少なくともこの特定のユースケースでは。より一般的な解決策を歓迎します):
c++ - C++: イベント コールバックとしてのクラス メンバー関数
プロジェクトに単純なメッセージング システムを追加しようとしています。このシステムでは、関数によってイベントを呼び出すことができます。これにより、そのイベントに登録されているすべてのコールバックが呼び出されます。
これを行う論理的な方法は、関数ポインターを使用することです。登録のために、目的のコールバック関数へのポインターをイベント マネージャーに渡すことは簡単に可能です。イベント コールバック関数は常に を返し、引数としてint
を受け取ります。void*
ただし、静的グローバル関数をイベント コールバックとして登録したくありません。クラス メンバー関数を使用して登録したいと考えています。
C++でこれを達成することさえ可能ですか? 異なるクラスのメンバー関数へのポインターを格納および呼び出しますが、関数ヘッダーは同じです。
これが不可能な場合、これを回避する方法について何か提案はありますか? イベントリスナーをクラスに直接追加したいと思っています。
c++ - メンバー関数へのポインタを使用して関数を呼び出す方法
私はクラスを持っています:
ここで、run()内でtest_func()を呼び出します。
コードの最後の行は、どの組み合わせを試しても機能しません(コンパイルエラー)。
c++ - フック用の COM メソッドへのポインタを取得する方法は?
これは過剰に答えられた質問のように思えますが、これは異なります。いくつかのメソッドをエクスポートするこの ActiveX オブジェクトがあります。そのメソッドの 1 つにフックを設定する必要があります。つまりFunc1
、 などを使用してこれを行う方法を知っていVirtualProtect()
ます。ollydbg を開いて ActiveX DLL を掘り下げるとFunc1
、フックを設定する必要がある場所の正確なアドレスが表示されます。
Visual Studio 2008 を使用して、プリコンパイラ ディレクティブを使用しています。
そして私のコードでは、これをやろうとしています:
コンパイル時にエラーを返します:
エラー C2440: '初期化中': 'HRESULT (__stdcall IMyActx::* )(BSTR,BSTR)' から 'LPVOID' に変換できません。
私が調査したところ、暗黙的なパラメーターのために、クラスへのポインターを関数へのポインターにキャストできないことがわかりましたthis
。
ただし、この関数を呼び出すつもりはありません。メモリ内のアドレスを知りたいだけで、それをフック ルーチン (LPVOID
ポインタを想定) に渡すことができます。
関数を呼び出すことはできるが、メモリ内の生のアドレスを取得できないということは、私には考えられないようです。必要なポインターを取得するためだけに、x86 アセンブリ コードを挿入したくなります。
読んでくれてありがとう。
編集...考えてみると...純粋な仮想クラスであるLPVOID ptr = &IMyActx::Func1;
ため、機能しないはずです! IMyActx
とにかく、オブジェクトをインスタンス化して生のポインターを取得しようとする前に、いくつかの組み合わせを試しましたが、Func1
これまでのところ何も機能しませんでした。Func1
への呼び出しが次のように生成されることを ollydbg で確認します。
DWORD
したがって、 atvptr + 0x1C
バイトを読み取る必要があると想定できます。
私の記憶が正しければ、Component Object Model は、常に同じインターフェイス ID が与えられたFunc1
ptrであることを保証します。[vptr + 0x1C]
永遠に。右?
やや疑似コードで、おそらく次のようなことをします。
c++ - メンバー関数ポインター - アドレスのみ?
http://www.codeproject.com/KB/cpp/fastdelegate2.aspx
上記の記事の導入部の 2 番目の段落では、次のように述べています。.. わかりませんか?実際にオブジェクトとメンバー関数をコピーして保存する必要がありますか? メンバー関数のアドレスを格納するだけではありませんか?