Ukazatel členské funkce C++

Ukazatel Clenske Funkce C



V C++ ukazatele na členské funkce pomáhají při odkazování na členské funkce v rámci třídy. Poskytují způsob, jak uložit a volat členskou funkci na instanci třídy, což přispívá k flexibilitě a rozšiřitelnosti v různých situacích. Jedno běžné použití ukazatelů na členské funkce je, když musí být spuštěno odlišné chování na základě podmínek běhu. Aplikace může dynamicky vybrat a volat vhodné chování pomocí ukazatelů na členské funkce. Ukazatele na členské funkce jsou navíc užitečné v situacích, které vyžadují oddělení systémových komponent.

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:

#include

pomocí 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:

#include

pomocí 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:

#include

pomocí 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:

#include

pomocí 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:

#include

pomocí 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.