問題タブ [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.

0 投票する
2 に答える
11610 参照

c++ - boost :: bind&boost::functionのオーバーロードまたはテンプレート化されたメンバー関数へのポインター

私はコールバックメカニズムを持っています、関係するクラスは次のとおりです:

まず、このコードはコンパイルされません。これはイラストです。

テンプレートを使用すると例が複雑になりますが、問題に影響するため、テンプレートを残しました。Connectorクラスは、処理するイベントタイプの数を認識していないため、サブスクライブをテンプレート化する必要があることは確かです。私が作成しようとすると:

OnEventを特殊化を使用してテンプレート関数として作成しようとしましたが、コンパイラがOnEvent関数をテンプレート特殊化ではなくオーバーロードとして処理しているようです。そうでない場合、明示的に宣言しようとすると、名前空間エラーではなくテンプレート特殊化が発生します。

私はコンパイルするために以下を得ることができます:

これは、コンパイル、実行、および動作します。

ではない。オーバーロードされた関数のアドレスを正しく指定していないためだと思います。

これをすべてテディベアに説明したので、私の質問は「オーバーロードまたはテンプレート化されたメンバー関数への関数ポインターを正しく作成し、このポインターをそれにバインドするにはどうすればよいですか?」だと思います。

0 投票する
4 に答える
2084 参照

c++ - メンバー関数へのポインタを呼び出すにはどうすればよいですか?

理解できないコンパイルエラー(MS VS 2008)が発生します。何時間もそれをいじった後、それはすべてぼやけており、私が見逃している非常に明白な(そして非常に愚かな)何かがあるように感じます。重要なコードは次のとおりです。

コンパイラーは矢印で「項は1つの引数を取る関数に評価されない」と主張しています。なぜだめですか?PFNは、1つの引数を取る関数としてプロトタイプ化され、MAP_ENTRY.pfnはPFNです。ここで何が欠けていますか?

0 投票する
5 に答える
2761 参照

c++ - 一般メンバ関数ポインタの定義方法

タイマーが切れたときにコールバック メソッドを呼び出す必要がある Timer クラスを作成しました。現在、通常の関数ポインターで動作しています (それらは void (*)(void) として宣言されています。Elapsed イベントが発生すると、関数ポインターが呼び出されます。

署名 void (AnyClass::*)(void) も持つメンバー関数で同じことを行うことは可能ですか?

ありがとう仲間。

編集: このコードは、Windows とリアルタイム OS (VxWorks) で動作する必要があるため、外部ライブラリを使用しないことをお勧めします。

EDIT2:確かに、必要なのは、引数なしで「AnyClass.AnyMethod」のコンストラクターで引数を取り、voidを返すタイマークラスを持つことです。この引数を保存する必要があり、後者はコードのポイントで、この変数が指すメソッドを実行するだけです。希望は明らかです。

0 投票する
2 に答える
2251 参照

c++ - 関数で定義されたローカルクラスのメンバー関数のアドレスを取得する方法(C ++)

私は次のことを行おうとしています。関数内でローカルに定義されたクラスからメンバー関数のアドレスを取得します。

#2と#3を試してみてください。GCCを完全に混乱させます。私が何をしようとしているのかわかりません。試行#1は、「setupCallback(void(SomeUnitTest :: someTest():: NestedClass :: SomeFunction :: *)など)の形式のsetupCallbackが存在しないことを示す、より役立つエラーメッセージを生成します。これが試行#3の誕生です。

関数内で定義されたクラスに関する多くの情報を実際に見つけることができません。誰かがこれの正しい構文を知っていますか、そしておそらくこのトピックを議論するリソースを持っていますか?

両方のポスターが指摘しているように、これは解決されたようです。ローカルクラスにはリンクがなく、機能しません。これを知った今、この問題に遭遇し、この質問に遭遇した他の人のために、これについて説明しているこの記事を見つけました:http: //www.informit.com/guides/content.aspx? g=cplusplus&seqNum=420

編集:setupCallback()の明確化、より通常のクラスでの作業例
編集#2:「ネストされた」を「ローカル」に変更するように文言を更新しました。setupCallbackの詳細を追加しました。
編集#3:詳細情報へのリンクを追加しました。みんな、ありがとう。

0 投票する
1 に答える
592 参照

c++ - マルチ インデックス コンテナーを後押しするテンプレート化されたメンバー関数

したがって、ブーストマルチインデックスコンテナがあります。

ご覧のとおり、この設計では、このコンテナーを作成するために使用するすべてのオブジェクトに、"name" という名前の文字列を返すメンバー関数が必要です。

これは明らかに理想的ではありません。「キー」を渡す方法をいくつか試しましたが、どれも機能しません..

私はこれを試しました..

しかし、喜びはありません..

コンパイラは、Object::name は型ではないと不平を言いますが、これを修正する方法がわかりません。テンプレートに型を提供する方法を考え出したとしても、コンテナーで使用される "Object::name" の具体的なインスタンスが必要です。

たぶん、型を渡してから、構築時にメンバー関数を渡す必要がありますか? しかし、どうやってコンテナを構築するのですか.. 頭が痛い!?!

以下のAlexyは、このソリューションを親切に提供してくれました

ただし、これにより次のコンパイラ エラーが発生しました。

マークされた行で..

Ok。これは、誤って署名された「&Object::name」パラメーターを渡した私のせいであることが判明しました...私はこれを修正しました..

0 投票する
2 に答える
1707 参照

c++ - 派生クラスの引数を受け入れる基本クラスの引数を持つメンバー関数ポインター

だから私はこのイベント管理クラスに取り組んでいます。署名のメンバー関数へのポインターのリストを保存していますvoid (Event*)。ここで、イベントは現時点でランダムなデータを保存する単なる構造体です。

異なるバージョンの Event を派生させ、それらのメンバー関数へのポインターをこのクラスに渡すことができるかどうか疑問に思っています。現在、私はこれを試しています。

これにより、XCode で次のエラーが発生します。

EventManager::RegisterEventHandler(const char [9], void (HelloWorld::*)(MouseEvent*), HelloWorld*&)エラー: ' ' の呼び出しに一致する関数がありません

関数シグネチャで派生クラスを期待しているポインターを安全に渡す方法を知っていますか? ありがとう。

0 投票する
1 に答える
302 参照

c++ - メンバー関数のテンプレート化された引数からメンバー関数を呼び出す

私がコンパイルすることができない次のコードを考えると。

次のエラーメッセージが表示されます

。*を使用していると思いましたが、明らかに何か問題があります。

メンバー関数を呼び出すにはどうすればよいですか?

私はもう試した

どれもうまくいきませんでした。

0 投票する
7 に答える
1995 参照

c++ - C++ でメンバー関数のアドレスを変更する

C++ では、メンバー関数のアドレスを取得することで関数ポインターを簡単に作成できます。しかし、そのローカル関数のアドレスを変更することは可能ですか?

つまり、同じクラスに funcA() と funcB() があり、定義が異なるとします。funcA() のアドレスを funcB() のアドレスに変更して、実行時に funcA() を呼び出すと実際に funcB() が呼び出されるようにしようとしています。私はこれが醜いことを知っていますが、私はこれを行う必要があります、ありがとう!

編集 - - - - -

私がやろうとしていることの背景:

既存のコード ベースの単体テストを実装したいと考えています。すべてのモジュールが継承している基本クラスのメソッドの一部は非仮想です。製品コードを編集することは許可されていません。ビルドプロセスをいじって、関連するメソッドを仮想に設定した基本クラスに置き換えることができますが、このようなハックを使用したいと思いました(可能だと思いました)。

また、私は技術的な好奇心からこのトピックに興味があります。この問題をハックしようとするプロセスを通じて、コード生成や関数検索などの仕組みが内部でどのように機能するかについてかなりのことを学んでいるからです。大学2年を終えたばかりで、学校で学ぶ機会がありませんでした。私はCSではなくコンピュータ工学プログラムにいるので、学校でそのようなことを教えられるかどうかはわかりません.

トピックに戻る メソッド funcA() と funcB() は確かに同じ署名を持っているため、問題は & 演算子を使用して関数のアドレスしか取得できないことです? 関数のアドレスを変更したり、メモリの一部を破損することなくそのアドレスの内容をスワップアウトしたりできないというのは正しいでしょうか? 関数が dll にエクスポートされている場合、DLL インジェクションはこのような状況に適したアプローチでしょうか?

0 投票する
4 に答える
31872 参照

c++ - C ++でメンバーオブジェクトにメンバー関数ポインターを渡す

C++ で関数へのポインターを使用する際に問題があります。これが私の例です:

コンパイラは次の場所でエラーを返しますtestFoo.myBar.funcP = &testFoo.hello;:

ISO C++ では、バインドされたメンバー関数のアドレスを取得して、メンバー関数へのポインターを形成することを禁止しています。「&foo::こんにちは」と言う

代入で'void (foo:: )()' を 'void ( )()' に変換できません

だから私はこのようにそれを試しました:

しかし今、コンパイラはもう1つ追加します:

「foo」は宣言されていません

それを機能させる方法はありますか?

提案を事前にありがとう

0 投票する
2 に答える
1300 参照

c++ - 別のメソッドからメソッドへのポインタを呼び出す方法

少し前にこの問題があり、あきらめましたが、最近戻ってきました。

マークされた行でエラーが発生します:

助けてくれて本当にありがとう。今日、部分的に私を助けた同様の質問がありました: link . しかし、それは私の問題に対する完全な答えではないようです。

実際には、これら 2 つの問題の違いは 1 つだけです。それは、関数が呼び出される場所です。

御時間ありがとうございます