MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C++の基礎 - コールバック関数のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C++の基礎 - コールバック関数
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== コールバック関数とは == コールバックとは、プログラミングにおいて、他のコードの引数として渡されるサブルーチンである。<br> これにより、低レベルの抽象化層が高レベルの層で定義された関数(サブルーチン)を呼び出せるようになる。<br><br> == C言語のサンプルコード == 下記のサンプルコードにおいて、main() -> Hello() -> Show() の順番に呼ばれる機構をコールバックと呼ぶ。<br> <syntaxhighlight lang="c++"> // main.c #include <stdio.h> void Hello(void (fnShow)(void)); void Show(void); int main() { Hello(Show); return 0; } void Hello(void (fnShow)(void)) { fnShow(); } void Show(void) { printf("Hello World!!"); } </source> <br><br> == C++言語のサンプルコード == 下記のサンプルコードにおいて、CInvoker::Executeを呼び出すことでCInvoker::CallbackFuncがコールバックされる。<br> <syntaxhighlight lang="c++"> // CInvoker.h class CInvoker { private: int m_Data; pubic: CInvoker(); ~CInvoker(); void Execute(); static int CallbackFunc(void* userData); // コールバック関数 } // CInvoker.cpp // コンストラクタ CInvoker::CInvoker() : m_Data(100) { } // デストラクタ CInvoker::~CInvoker() { } void CInvoker::Execute() { int result = 0; result = reinterpret_cast<CInvoker*>(this)->CallbackFunc(this); } // コールバック関数 int CInvoker::CallbackFunc(void* clsObject) { CInvoker clsInvoker = reinterpret_cast<CInvoker*>(clsObject); return clsInvoker->m_Data; } </source> <br><br> == 仕組み == C++のクラスでコールバックメソッドを実行するには静的(static)なメソッドにしなければならない。<br> 静的(static)でないと、以下のコンパイルエラーが表示される。<br> 仮想関数のアドレスを取ろうとしました これは、クラスが生成されるまでメモリ上に展開されず、呼び出し元のメソッドがどのポインタを参照すればよいかわからないためエラーになる。<br> 即ち、静的メソッドにしてポインタの位置を固定した後、reinterpret_castでアドレスの解釈を強制的に変更することで、<br> 動的に取得したクラスメソッドにアクセスできるようになる。<br><br> __FORCETOC__ [[カテゴリ:C++]]
C++の基礎 - コールバック関数
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse