Delegateを使って関数を呼び出すサンプルコード
VisualStudio2005->新規プロジェクト->CLRコンソールアプリケーションから。
関数を登録していって呼び出すまで。
ソースは続きを読むから:
//Delegateから関数を呼ぶサンプル #include "stdafx.h" using namespace System; //Delegate関数を宣言 //「型の宣言」と同様。引数、戻り値がこのようである関数を登録出来る delegate void DelegateFunction(int); //func1,2は通常の関数 void func1(int n) { Console::WriteLine(L"func1 start------------------------"); Console::WriteLine(L"func1() : n = {0}", n); } void func2(int n) { Console::WriteLine(L"func2 start------------------------"); Console::WriteLine(L"func2() : n = {0}", n); } //クラス内関数、当然いずれもpublic //Stat_funcAはスタティック関数、funcAは非スタティック関数 //スタティック関数=グローバル関数のようなもの、Class宣言の時点で存在する ref class ClassA { public: static void Stat_funcA(int n) { Console::WriteLine("Stat_funcA start---------------------------"); Console::WriteLine("Stat_funcA() : n = {0}", n); } void funcA(int n) { Console::WriteLine("funcA start---------------------------"); Console::WriteLine("funcA() : n = {0}", n); } }; //main関数 //上記関数をすべてDelegateして実行 int main(array<System::String ^> ^args) { int n = 10; //Delegate宣言 DelegateFunction ^oDelegateFunction = nullptr; //func1を登録 oDelegateFunction = gcnew DelegateFunction(&func1); //続けて登録可能 oDelegateFunction += gcnew DelegateFunction(&func2); //Classのスタティック関数なら普通に登録可能 oDelegateFunction += gcnew DelegateFunction(&ClassA::Stat_funcA); //非スタティックだとClass宣言だけではまだ存在しない //一度オブジェクトとして宣言してから登録する必要がある //この場合、Delegate関数は関数の直接登録ではなく //オブジェクトを第一引数にする必要がある(オーバーロードなので引数増やせばいい) ClassA ^oClassA = gcnew ClassA(); oDelegateFunction += gcnew DelegateFunction(oClassA, &ClassA::funcA); //実行後ループ oDelegateFunction(n); while(1); return 0; }