ホームページ > バックエンド開発 > C++ > C でクラス メンバー関数をコールバックとして正しく渡す方法

C でクラス メンバー関数をコールバックとして正しく渡す方法

Linda Hamilton
リリース: 2024-12-16 13:26:21
オリジナル
534 人が閲覧しました

How to Correctly Pass Class Member Functions as Callbacks in C  ?

クラス メンバー関数をコールバックとして渡すときのコンパイル エラーを解決する

クラス メンバー関数をコールバックとして渡すときに、誤解が原因でコンパイル エラーが発生する構文と member の非表示の "this" パラメータについてfunction.

メンバー関数の明確化

メンバー関数はスタンドアロン関数ではなく、追加の非表示の「this」ポインターを持つ関数です。このポインタは、関数が属するクラスのインスタンスを参照します。クラス インスタンス構文 (object.memberFunction() など) を使用してメンバー関数を呼び出す場合、コンパイラは "this" の値を自動的に決定します。

構文難題

&CLoggersInfra::RedundencyManagerCallBack をコールバックとして渡そうとしたため、最初のアプローチは失敗しました。この関数ポインタには、必要な「this」ポインタがありません。正しい構文は次のとおりです。

m_cRedundencyManager->Init(std::bind(&CLoggersInfra::RedundencyManagerCallBack, this));
ログイン後にコピー

非表示の "this" を明らかにする

CLoggersInfra クラスの特定のインスタンスに固有のコールバックを渡したいとします。非表示の「this」ポインターを考慮するには、それを明示的にバインドする必要があります。

std::bind1st および boost::bind Rescue

Use std::bind1stまたは、boost::bind で「this」ポインタをバインドし、インスタンスを隠しパラメータとコールバックの元のパラメータとして受け取る新しい関数を作成します いつものように。これにより、コンパイルの問題が解決されます。

Hidden Catch

Init には生の関数ポインターが必要ですが、boost::bind ではそのままでは提供されません。ただし、StackOverflow は、boost::functions を生のポインターに変換するソリューションを提供します。

Lambda 関数による C 11 の更新

C 11 以降では、キャプチャする lambda 関数が使用されます。この目的のために、「this」を boost::bind に置き換えることができます。

以上がC でクラス メンバー関数をコールバックとして正しく渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート