Příklad 1:
Zahrnuli jsme hlavičkový soubor „iostream“, aby bylo snadné používat definované funkce. Pak máme „jmenný prostor std“. Pod tím vygenerujeme třídu s názvem „MyNewClass“ a použijeme konstruktor „public“.
V „public“ vytvoříme členskou funkci s názvem „myFunc“ a deklarujeme „int num“ jako parametr „myFunc()“. Pod tím použijeme „cout“ a pod tím vyvoláme metodu main(), ve které vytvoříme ukazatel členské funkce. Deklarujeme ukazatel „MyFuncPtr“ na typ členské funkce s uvedením třídy „MyNewClass“ a typu parametru (int).
Poté vytvoříme objekt třídy s názvem „Class_obj“ a poté zavoláme členskou funkci pomocí ukazatele „*MyFuncPtr“ umístěním objektu třídy s tímto. Při zavolání ukazatele členské funkce přiřadíme jako parametr „10“, abychom to vykreslili.
Kód 1:
#includepomocí jmenného prostoru std ;
třída MyNewClass {
veřejnost :
prázdnota myFunc ( int na jednom ) {
cout << 'Hodnota je' << na jednom << endl ;
}
} ;
int hlavní ( ) {
prázdnota ( MojeNováClass ::* MyFuncPtr ) ( int ) = & MojeNováClass :: myFunc ;
MyNewClass Class_obj ;
( Class_obj. * MyFuncPtr ) ( 10 ) ;
vrátit se 0 ;
}
Výstup:
To ilustruje fungování ukazatelů na členské funkce. Ukazatel členské funkce lze použít ke spouštění členských funkcí dynamicky podle aktuálních podmínek.
Příklad 2:
Pro jednoduché použití funkcí, které jsou definovány v hlavičkovém souboru „iostream“, jsme zde zahrnuli „iostream“. Jako další je umístěn jmenný prostor std. Pod ní vytvoříme třídu „Test“ a poté použijeme konstruktor „public“. Členskou funkci „myTestingFunc“ definujeme jako „public“ a v tomto případě nastavíme „int t_value“ jako parametr pro „myTestingFunc()“. Níže je použita funkce „cout“ a volá se metoda main(). Poté vytvoříme ukazatel členské funkce.
Zde specifikujeme třídu „Test“ a ukazatel členské funkce „*MyTestFuncPtr“. Ukazateli členské funkce přiřadíme „&Test::myTestingFunc“, který je deklarován jako „void (Test::*MyTestFuncPtr)(int)“.
Dále vygenerujeme objekt třídy „t_obj“ a použijeme jej k volání členské funkce vložením objektu třídy a použitím ukazatele „*MyTestFuncPtr“. Aby se to zobrazilo, když zavoláme ukazatel členské funkce, přiřadíme jako parametr „932“.
Kód 2:
#includepomocí jmenného prostoru std ;
třída Test {
veřejnost :
prázdnota myTestingFunc ( int t_hodnota ) {
cout << 'Testovací hodnota je' << t_hodnota << endl ;
}
} ;
int hlavní ( ) {
prázdnota ( Test ::* MyTestFuncPtr ) ( int ) = & Test :: myTestingFunc ;
Test t_obj ;
( t_obj. * MyTestFuncPtr ) ( 932 ) ;
vrátit se 0 ;
}
Výstup:
Vykreslí se výsledek daného kódu. Vidíme, že jsme zavolali „ukazatel členské funkce“ s objektem třídy, jak je znázorněno zde.
Příklad 3:
Třída, kterou generujeme v tomto kódu, je „MyNewCar“, kde využíváme „veřejný“ konstruktor a vytváříme v něm členskou funkci, která je „startCarEngine()“. Do této funkce přidáme „cout“, který se vykreslí, když tuto funkci zavoláme v našem kódu. Poté vytvoříme další členskou funkci, která je „stopCarEngine()“ a v této členské funkci znovu použijeme „cout“.
Poté vyvoláme funkci main() a poté deklarujeme ukazatel členské funkce, který je „MyNewCar::*carEngineFunc()“. Pod tím vytvoříme objekt třídy „MyNewCar“ s názvem „myCar_obj“. Poté přiřadíme funkci „startCarEngine“ ukazateli „carEngineFunc“. Pod tím tuto funkci zavoláme pomocí ukazatele „carEngineFunc“ tak, že k němu přiřadíme název objektu.
Dále znovu přiřadíme funkci „stopCarEngine“ k ukazateli „carEngineFunc“. Níže zavoláme tuto funkci předáním názvu objektu spolu s odkazem „carEngineFunc“.
Kód 3:
#includepomocí jmenného prostoru std ;
třídy MyNewCar {
veřejnost :
prázdnota startCarEngine ( ) {
cout << 'Motor auta startuje' << endl ;
}
prázdnota stopCarEngine ( ) {
cout << „Motor auta se zastaví“ << endl ;
}
} ;
int hlavní ( ) {
prázdnota ( Moje nové auto ::* carEngineFunc ) ( ) ;
MyNewCar myCar_obj ;
carEngineFunc = & Moje nové auto :: startCarEngine ;
( myCar_obj. * carEngineFunc ) ( ) ;
carEngineFunc = & Moje nové auto :: stopCarEngine ;
( myCar_obj. * carEngineFunc ) ( ) ;
vrátit se 0 ;
}
Výstup:
Zde je zobrazeno fungování „ukazatele členské funkce“. Vidíme, že jsme vytvořili ukazatel členské funkce a zobrazili výsledek zde.
Příklad 4:
Po zahrnutí hlavičkového souboru a „std namespace“ zde deklarujeme třídu „MyNewStudent“. Členská funkce „studentPass()“ je jednou z členských funkcí, které vytváříme pro třídu „MyStudentClass“, kterou zde generujeme. K této funkci také přidáme „cout“, která se vykreslí, když ji zavoláme v našem kódu.
Dále napíšeme členskou funkci „studentFail()“, kde ještě jednou použijeme „cout“. Poté se zavolá funkce main() a deklaruje se ukazatel členské funkce „(MyNewStudent::*studentResultFunc)()“. Pod tím vygenerujeme objekt ” myStd_obj ”, který patří do třídy “MyNewStudent”.
Dále přiřadíme funkci „studentPass“ ukazateli „studentResultFunc“. Pod tím tuto funkci zavoláme předáním názvu objektu spolu s odkazem „studentResultFunc “. Funkce „studentFail“ je znovu přiřazena k ukazateli „studentResultFunc“. Pod tím vyvoláme tuto metodu zadáním odkazu „carEngineFunc“ a názvu objektu.
Nyní se zde zavolají obě funkce a vykreslí se příkazy, které jsme do těchto funkcí zahrnuli.
Kód 4:
#includepomocí jmenného prostoru std ;
třída MyNewStudent {
veřejnost :
prázdnota student Pass ( ) {
cout << 'studentský průkaz' << endl ;
}
prázdnota studentFail ( ) {
cout << 'Student selže' << endl ;
}
} ;
int hlavní ( ) {
prázdnota ( Můj NovýStudent ::* studentResultFunc ) ( ) ;
MyNewStudent myStd_obj ;
studentResultFunc = & Můj NovýStudent :: student Pass ;
( myStd_obj. * studentResultFunc ) ( ) ;
studentResultFunc = & Můj NovýStudent :: studentFail ;
( myStd_obj. * studentResultFunc ) ( ) ;
vrátit se 0 ;
}
Výstup:
V našem kódu jsme vytvořili členské funkce a poté ukazatel členské funkce. Poté jsme zavolali členskou funkci a zobrazili výsledek zde.
Příklad 5:
V tomto případě se vytvoří „SampleClass“. Poté se sem umístí ukazatel členské funkce, což je „(SampleClass::*MyFunc)()“. Pod tím vytvoříme ukazatel funkce, který je „(*MyFuncPtr)()“. Pod ním deklarujeme „name“ proměnné „string“ a také ukazatel členské funkce „MyFunc f“.
Poté máme „veřejný“ konstruktor, kde definujeme tuto proměnnou členské funkce. Pod tím vytvoříme členské funkce s názvem „myFunc_1()“ a „myFunc_1()“ a také přidáme „cout“ do každé členské funkce, která se zobrazí, když tuto členskou funkci zavoláme.
Potom zavoláme tento ukazatel členské funkce pomocí „(this->*f)()“. Poté znovu umístíme funkce. Zde změníme příkazy „cout“, které jsme dříve přidali. Poté je nyní vyvoláno „main()“ a ukazatel členské funkce je definován jako „MyFunc f = &SampleClass::myFunc_2“.
Potom je ukazatel funkce také definován jako „MyFuncPtr fp = myFunc_1“. Poté napíšeme „(a.*f)()“, abychom využili ukazatel členské funkce. „b.func“ je umístěn pro využití členské funkce. Poté umístíme „fp()“ pro volání ukazatele funkce.
Kód 5:
#includepomocí jmenného prostoru std ;
třída SampleClass ;
typedef prázdnota ( SampleClass ::* MyFunc ) ( ) ;
typedef prázdnota ( * MyFuncPtr ) ( ) ;
třída SampleClass {
název řetězce ;
MyFunc f ;
veřejnost :
SampleClass ( konst char * název )
: název ( název ) ,
F ( & SampleClass :: myFunc_1 )
{ }
prázdnota myFunc_1 ( ) { cout << název << 'Zavolali jsme sem fuction 1' << endl ; }
prázdnota myFunc_2 ( ) { cout << název << 'Zavolali jsme zde funkci 2' << endl ; }
prázdnota func ( ) {
( tento ->* F ) ( ) ;
}
} ;
prázdnota myFunc_1 ( ) { cout << 'První funkce' << endl ; }
prázdnota myFunc_2 ( ) { cout << 'Druhá funkce' << endl ; }
int hlavní ( )
{
MyFunc f = & SampleClass :: myFunc_2 ;
MyFuncPtr fp = myFunc_1 ;
SampleClass a ( 'První - ' ) , b ( 'druhý - ' ) ;
( A. * F ) ( ) ;
b. func ( ) ;
fp ( ) ;
}
Výstup:
Výsledek kódu je nyní vykreslen zde, což vykreslí výsledek odpovídajícím způsobem, jak jsme nazývali funkce v našem kódu.
Závěr
Prozkoumali jsme, že „ukazatele na členské funkce“ v C++ usnadňují dynamickou vazbu, zapouzdření chování a flexibilní manipulaci s vyvoláním funkce v kontextu OOP. Zjistili jsme, že použití „ukazatelů na členské funkce“ může výrazně zlepšit modularitu a flexibilitu kódových základen C++ a poskytnout tak výkonný nástroj pro řešení mnoha výzev v oblasti návrhu a běhu.