例 1:
定義された関数を簡単に利用できるように、「iostream」ヘッダー ファイルがインクルードされています。次に、「名前空間 std」があります。この下で、「MyNewClass」という名前のクラスを生成し、「public」コンストラクターを利用します。
「public」では「myFunc」という名前のメンバー関数を作成し、「myFunc()」のパラメータとして「int num」を宣言します。この下では、「cout」を使用し、メンバー関数ポインターを作成する main() メソッドを呼び出します。 「MyNewClass」クラスとパラメーターの型 (int) を指定して、メンバー関数型への「MyFuncPtr」ポインターを宣言します。
この後、「Class_obj」という名前のクラス オブジェクトを作成し、これにクラス オブジェクトを配置して、「*MyFuncPtr」ポインターを使用してメンバー関数を呼び出します。メンバー関数ポインターを呼び出すときにこれをレンダリングするパラメーターとして「10」を割り当てます。
コード 1:
#include名前空間 std を使用する ;
クラスMyNewClass {
公共 :
空所 myFunc ( 整数 1つで ) {
コート << 「値は」 << 1つで << 終わり ;
}
} ;
整数 主要 ( ) {
空所 ( 私の新しいクラス ::* MyFuncPtr ) ( 整数 ) = & 私の新しいクラス :: myFunc ;
MyNewClass クラス_obj ;
( クラスオブジェクト。 * MyFuncPtr ) ( 10 ) ;
戻る 0 ;
}
出力:
これは、メンバー関数ポインタの仕組みを示しています。メンバー関数ポインターを使用すると、現在の条件に従ってメンバー関数を動的に起動できます。
例 2:
「iostream」ヘッダーファイルで定義されている関数を簡単に使用するために、ここでは「iostream」をインクルードします。 「namespace std」が次に配置されます。その下に「Test」クラスを作成し、「public」コンストラクターを使用します。このインスタンスでは、「public」に「myTestingFunc」メンバー関数を定義し、「myTestingFunc()」のパラメータとして「int t_value」を設定します。以下では「cout」関数が使用され、main() メソッドが呼び出されます。次に、メンバー関数ポインターを作成します。
ここでは「Test」クラスと「*MyTestFuncPtr」メンバー関数ポインターを指定します。 「void (Test::*MyTestFuncPtr)(int)」として宣言されたメンバー関数ポインターに「&Test::myTestingFunc」を代入します。
次に、「t_obj」クラス オブジェクトを生成し、これを使用してクラス オブジェクトを配置し、「*MyTestFuncPtr」ポインターを使用してメンバー関数を呼び出します。メンバー関数ポインターを呼び出すときにこれを表示するには、パラメーターとして「932」を割り当てます。
コード 2:
#include名前空間 std を使用する ;
クラステスト {
公共 :
空所 myTestingFunc ( 整数 t_value ) {
コート << 「テスト値は」 << t_value << 終わり ;
}
} ;
整数 主要 ( ) {
空所 ( テスト ::* MyTestFuncPtr ) ( 整数 ) = & テスト :: myTestingFunc ;
t_obj をテストする ;
( t_obj. * MyTestFuncPtr ) ( 932 ) ;
戻る 0 ;
}
出力:
指定されたコードの結果がレンダリングされます。ここに示すように、クラス オブジェクトを使用して「メンバー関数ポインター」を呼び出したことがわかります。
例 3:
このコードで生成するクラスは「MyNewCar」で、「public」コンストラクターを利用し、その中に「startCarEngine()」というメンバー関数を作成します。この関数では、コード内でこの関数を呼び出したときにレンダリングする「cout」を追加します。次に、別のメンバー関数「stopCarEngine()」を作成し、このメンバー関数で再度「cout」を利用します。
この後、main() 関数を呼び出して、メンバー関数ポインター「MyNewCar::*carEngineFunc()」を宣言します。この下に、「myCar_obj」という名前の「MyNewCar」クラス オブジェクトを作成します。次に、「startCarEngine」関数を「carEngineFunc」ポインターに割り当てます。この下で、「carEngineFunc」ポインターを使用してオブジェクト名を配置してこの関数を呼び出します。
次に、「stopCarEngine」関数を「carEngineFunc」ポインターに再割り当てします。その下では、オブジェクト名を「carEngineFunc」参照とともに渡すことでこの関数を呼び出します。
コード 3:
#include名前空間 std を使用する ;
クラスMyNewCar {
公共 :
空所 車のエンジンを始動する ( ) {
コート << 「車のエンジンがかかる」 << 終わり ;
}
空所 停止車エンジン ( ) {
コート << 「車のエンジンが止まってしまった」 << 終わり ;
}
} ;
整数 主要 ( ) {
空所 ( 私の新車 ::* 車エンジン機能 ) ( ) ;
MyNewCar myCar_obj ;
車エンジン機能 = & 私の新車 :: 車のエンジンを始動する ;
( myCar_obj. * 車エンジン機能 ) ( ) ;
車エンジン機能 = & 私の新車 :: 停止車エンジン ;
( myCar_obj. * 車エンジン機能 ) ( ) ;
戻る 0 ;
}
出力:
ここでは「メンバ関数ポインタ」の働きを表示します。メンバー関数ポインターを作成し、その結果をここに表示したことがわかります。
例 4:
ヘッダー ファイルと「std 名前空間」をインクルードした後、ここで「MyNewStudent」クラスを宣言します。 「studentPass()」メンバー関数は、ここで生成する「MyStudentClass」クラス用に構築するメンバー関数の 1 つです。また、コード内で呼び出したときにレンダリングされるこの関数に「cout」を追加します。
次に、もう一度「cout」を使用する「studentFail()」メンバー関数を作成します。次に main() 関数が呼び出され、「(MyNewStudent::*studentResultFunc)()」メンバー関数ポインターが宣言されます。その下に、「MyNewStudent」クラスに属する「myStd_obj」オブジェクトを生成します。
次に、「studentPass」関数を「studentResultFunc」ポインタに割り当てます。その下では、オブジェクト名と「studentResultFunc」参照を渡してこの関数を呼び出します。 「studentFail」関数は「studentResultFunc」ポインタに再割り当てされます。その下で、「carEngineFunc」参照とオブジェクト名を指定してこのメソッドを呼び出します。
ここで両方の関数が呼び出され、これらの関数に含めたステートメントが表示されます。
コード 4:
#include名前空間 std を使用する ;
クラスMyNewStudent {
公共 :
空所 学生パス ( ) {
コート << 「学生証」 << 終わり ;
}
空所 学生失敗 ( ) {
コート << 「その生徒は失敗した」 << 終わり ;
}
} ;
整数 主要 ( ) {
空所 ( 私の新入生 ::* 学生結果機能 ) ( ) ;
MyNewStudent myStd_obj ;
学生結果機能 = & 私の新入生 :: 学生パス ;
( myStd_obj. * 学生結果機能 ) ( ) ;
学生結果機能 = & 私の新入生 :: 学生失敗 ;
( myStd_obj. * 学生結果機能 ) ( ) ;
戻る 0 ;
}
出力:
コード内にメンバー関数を作成してから、メンバー関数ポインターを作成しました。この後、メンバー関数を呼び出し、結果をここに表示しました。
例 5:
このインスタンスでは「SampleClass」が作成されます。次に、メンバー関数ポインターがここに配置されます。これは「(SampleClass::*MyFunc)()」です。この下に、「(*MyFuncPtr)()」という関数ポインターを作成します。その下で、「string」変数の「名前」と「MyFunc f」メンバー関数ポインターを宣言します。
この後、このメンバー関数変数を定義する「public」コンストラクターができます。この下に、「myFunc_1()」および「myFunc_1()」という名前のメンバー関数を作成し、このメンバー関数を呼び出すときに表示される「cout」を各メンバー関数に追加します。
次に、「(this->*f)()」を使用してこのメンバー関数ポインターを呼び出します。次に、関数を再度配置します。ここでは、以前に追加した「cout」ステートメントを変更します。次に、「main()」が呼び出され、メンバー関数ポインターが「MyFunc f = &SampleClass::myFunc_2」として定義されます。
そして、関数ポインタも「MyFuncPtr fp = myFunc_1」と定義されます。この後、メンバー関数ポインターを利用するために「(a.*f)()」と入力します。 「b.func」はメンバ関数を利用するために配置されています。次に、関数ポインタを呼び出す「fp()」を配置します。
コード5:
#include名前空間 std を使用する ;
クラスサンプルクラス ;
typedef 空所 ( サンプルクラス ::* マイファンク ) ( ) ;
typedef 空所 ( * MyFuncPtr ) ( ) ;
クラスサンプルクラス {
文字列名 ;
MyFunc f ;
公共 :
サンプルクラス ( 定数 文字 * 名前 )
: 名前 ( 名前 ) 、
f ( & サンプルクラス :: myFunc_1 )
{ }
空所 myFunc_1 ( ) { コート << 名前 << 「ここでは関数 1 を呼び出しました」 << 終わり ; }
空所 myFunc_2 ( ) { コート << 名前 << 「ここで関数 2 を呼び出しました」 << 終わり ; }
空所 機能 ( ) {
( これ ->* f ) ( ) ;
}
} ;
空所 myFunc_1 ( ) { コート << 「最初の機能」 << 終わり ; }
空所 myFunc_2 ( ) { コート << 「第二の機能」 << 終わり ; }
整数 主要 ( )
{
MyFunc f = & サンプルクラス :: myFunc_2 ;
MyFuncPtr fp = myFunc_1 ;
サンプルクラス a ( '初め - ' ) 、 b ( '2番 - ' ) ;
( a. * f ) ( ) ;
b. 機能 ( ) ;
FP ( ) ;
}
出力:
ここでコードの結果がレンダリングされ、コード内で関数を呼び出したときに結果がレンダリングされます。
結論
C++ の「メンバー関数ポインター」により、OOP のコンテキスト内での動的なバインディング、動作のカプセル化、および関数呼び出しの柔軟な処理が容易になることを調査しました。 「メンバー関数ポインター」を使用すると、C++ コードベースのモジュール性と柔軟性が大幅に向上し、設計と実行時の数多くの課題に対処するための強力なツールが提供されることがわかりました。