Δείκτης συνάρτησης μέλους C++

Deiktes Synarteses Melous C



Στη C++, οι δείκτες συνάρτησης μέλους βοηθούν στην αναφορά στις συναρτήσεις μέλους μέσα σε μια κλάση. Παρέχουν έναν τρόπο αποθήκευσης και κλήσης μιας συνάρτησης μέλους σε μια παρουσία μιας κλάσης, συμβάλλοντας στην ευελιξία και την επεκτασιμότητα σε διάφορες καταστάσεις. Μια κοινή χρήση των δεικτών συνάρτησης μέλους είναι όταν πρέπει να ενεργοποιούνται διαφορετικές συμπεριφορές με βάση τις συνθήκες χρόνου εκτέλεσης. Μια εφαρμογή μπορεί να επιλέξει και να καλέσει δυναμικά την κατάλληλη συμπεριφορά χρησιμοποιώντας δείκτες σε συναρτήσεις μέλους. Επιπλέον, οι δείκτες λειτουργιών μέλους είναι χρήσιμοι σε καταστάσεις που απαιτούν την αποσύνδεση των στοιχείων του συστήματος.

Παράδειγμα 1:

Περιλαμβάνουμε το αρχείο κεφαλίδας 'iostream' για να διευκολύνουμε τη χρήση των καθορισμένων συναρτήσεων. Στη συνέχεια, έχουμε το 'namespace std'. Κάτω από αυτό, δημιουργούμε την κλάση με το όνομα 'MyNewClass' και χρησιμοποιούμε τον κατασκευαστή 'δημόσιο'.

Στο 'public', δημιουργούμε τη συνάρτηση μέλους με το όνομα 'myFunc' και δηλώνουμε το 'int num' ως την παράμετρο του 'myFunc()'. Κάτω από αυτό, χρησιμοποιούμε το 'cout' και καλούμε τη μέθοδο main() κάτω από αυτό, στην οποία δημιουργούμε τον δείκτη συνάρτησης μέλους. Δηλώνουμε τον δείκτη «MyFuncPtr» στον τύπο συνάρτησης μέλους, προσδιορίζοντας την κλάση «MyNewClass» και τον τύπο παραμέτρου (int).







Μετά από αυτό, δημιουργούμε το αντικείμενο κλάσης με το όνομα «Class_obj» και στη συνέχεια καλούμε τη συνάρτηση μέλους με τη βοήθεια του δείκτη «*MyFuncPtr» τοποθετώντας το αντικείμενο κλάσης με αυτό. Εκχωρούμε το '10' ως την παράμετρο για την απόδοση του όταν καλούμε τον δείκτη της συνάρτησης μέλους.



Κωδικός 1:

#include

χρησιμοποιώντας το namespace std ;

τάξη MyNewClass {

δημόσιο :

κενός myFunc ( ενθ σε ένα ) {

cout << 'Η τιμή είναι' << σε ένα << endl ;

}

} ;

ενθ κύριος ( ) {

κενός ( MyNewClass ::* MyFuncPtr ) ( ενθ ) = & MyNewClass :: myFunc ;

MyNewClass Class_obj ;

( Class_obj. * MyFuncPtr ) ( 10 ) ;

ΕΠΙΣΤΡΟΦΗ 0 ;

}

Παραγωγή:



Αυτό δείχνει τη λειτουργία των δεικτών συνάρτησης μέλους. Ο δείκτης συνάρτησης μέλους μπορεί να χρησιμοποιηθεί για την εκκίνηση των συναρτήσεων μέλους δυναμικά σύμφωνα με τις τρέχουσες συνθήκες.





Παράδειγμα 2:

Για να χρησιμοποιήσετε τις συναρτήσεις που ορίζονται στο αρχείο κεφαλίδας 'iostream' απλά, συμπεριλαμβάνουμε εδώ το 'iostream'. Το 'namespace std' τοποθετείται επόμενο. Κάτω από αυτό, δημιουργούμε την κλάση 'Test' και στη συνέχεια χρησιμοποιούμε τον κατασκευαστή 'δημόσιο'. Ορίζουμε τη συνάρτηση μέλους «myTestingFunc» σε «δημόσιο» και ορίζουμε το «int t_value» ως την παράμετρο για το «myTestingFunc()» σε αυτήν την περίπτωση. Η συνάρτηση «cout» χρησιμοποιείται παρακάτω και καλείται η μέθοδος main(). Στη συνέχεια, δημιουργούμε τον δείκτη συνάρτησης μέλους.



Καθορίζουμε εδώ την κλάση 'Test' και τον δείκτη συνάρτησης μέλους '*MyTestFuncPtr'. Αντιστοιχίζουμε το “&Test::myTestingFunc” στον δείκτη της συνάρτησης μέλους που δηλώνεται ως “void (Test::*MyTestFuncPtr)(int)”.

Στη συνέχεια, δημιουργούμε το αντικείμενο κλάσης 't_obj' και το χρησιμοποιούμε για να καλέσουμε τη συνάρτηση μέλους βάζοντας το αντικείμενο κλάσης και χρησιμοποιώντας τον δείκτη '*MyTestFuncPtr'. Για να εμφανιστεί αυτό όταν καλούμε τον δείκτη της συνάρτησης μέλους, εκχωρούμε το '932' ως παράμετρο.

Κωδικός 2:

#include

χρησιμοποιώντας το namespace std ;

Τεστ τάξης {

δημόσιο :

κενός myTestingFunc ( ενθ t_value ) {

cout << 'Η τιμή δοκιμής είναι' << t_value << endl ;

}

} ;

ενθ κύριος ( ) {

κενός ( Δοκιμή ::* MyTestFuncPtr ) ( ενθ ) = & Δοκιμή :: myTestingFunc ;

Δοκιμή t_obj ;

( t_obj. * MyTestFuncPtr ) ( 932 ) ;

ΕΠΙΣΤΡΟΦΗ 0 ;

}

Παραγωγή:

Το αποτέλεσμα του δεδομένου κώδικα αποδίδεται. Μπορούμε να δούμε ότι καλέσαμε τον 'δείκτη συνάρτησης μέλους' με το αντικείμενο κλάσης όπως φαίνεται εδώ.

Παράδειγμα 3:

Η κλάση που δημιουργούμε σε αυτόν τον κώδικα είναι 'MyNewCar' όπου χρησιμοποιούμε τον κατασκευαστή 'δημόσιο' και δημιουργούμε τη συνάρτηση μέλους σε αυτό που είναι 'startCarEngine()'. Σε αυτή τη συνάρτηση, προσθέτουμε το 'cout' που αποδίδεται όταν καλούμε αυτήν τη συνάρτηση στον κώδικά μας. Στη συνέχεια, δημιουργούμε μια άλλη συνάρτηση μέλους που είναι 'stopCarEngine()' και χρησιμοποιούμε ξανά το 'cout' σε αυτήν τη συνάρτηση μέλους.

Μετά από αυτό, καλούμε τη συνάρτηση main() και μετά δηλώνουμε τον δείκτη της συνάρτησης μέλους που είναι 'MyNewCar::*carEngineFunc()'. Κάτω από αυτό, δημιουργούμε το αντικείμενο κλάσης 'MyNewCar' με το όνομα 'myCar_obj'. Στη συνέχεια, εκχωρούμε τη συνάρτηση «startCarEngine» στον δείκτη «carEngineFunc». Κάτω από αυτό, καλούμε αυτήν τη συνάρτηση με τη βοήθεια του δείκτη «carEngineFunc» τοποθετώντας το όνομα του αντικειμένου μαζί του.

Στη συνέχεια, επαναπροσδιορίζουμε τη συνάρτηση «stopCarEngine» στον δείκτη «carEngineFunc». Κάτω από αυτό, καλούμε αυτή τη συνάρτηση περνώντας το όνομα του αντικειμένου μαζί με την αναφορά 'carEngineFunc'.

Κωδικός 3:

#include

χρησιμοποιώντας το namespace std ;

κατηγορία MyNewCar {

δημόσιο :

κενός startCarEngine ( ) {

cout << 'Ο κινητήρας του αυτοκινήτου ξεκινά' << endl ;

}

κενός stopCarEngine ( ) {

cout << 'Η μηχανή του αυτοκινήτου σταματά' << endl ;

}

} ;

ενθ κύριος ( ) {

κενός ( Το νέο μου αμάξι ::* carEngineFunc ) ( ) ;

MyNewCar myCar_obj ;

carEngineFunc = & Το νέο μου αμάξι :: startCarEngine ;

( myCar_obj. * carEngineFunc ) ( ) ;

carEngineFunc = & Το νέο μου αμάξι :: stopCarEngine ;

( myCar_obj. * carEngineFunc ) ( ) ;

ΕΠΙΣΤΡΟΦΗ 0 ;

}

Παραγωγή:

Εδώ, εμφανίζεται η λειτουργία του 'δείκτη συνάρτησης μέλους'. Μπορούμε να δούμε ότι δημιουργήσαμε τον δείκτη συνάρτησης μέλους και εμφανίσαμε το αποτέλεσμα εδώ.

Παράδειγμα 4:

Αφού συμπεριλάβουμε το αρχείο κεφαλίδας και το 'std namespace', δηλώνουμε εδώ την κλάση 'MyNewStudent'. Η συνάρτηση μέλους ' studentPass()' είναι μία από τις συναρτήσεις μέλους που δημιουργούμε για την τάξη 'MyStudentClass' που δημιουργούμε εδώ. Προσθέτουμε επίσης 'cout' σε αυτή τη συνάρτηση που θα αποδοθεί όταν την καλέσουμε στον κώδικά μας.

Στη συνέχεια, γράφουμε τη συνάρτηση μέλους “studentFail()” όπου χρησιμοποιούμε το “cout” για άλλη μια φορά. Στη συνέχεια καλείται η συνάρτηση main() και δηλώνεται ο δείκτης της συνάρτησης μέλους '(MyNewStudent::*studentResultFunc)()'. Κάτω από αυτό, δημιουργούμε το αντικείμενο «myStd_obj» που ανήκει στην κλάση «MyNewStudent».

Στη συνέχεια, εκχωρούμε τη συνάρτηση «studentPass» στον δείκτη «studentResultFunc». Κάτω από αυτό, καλούμε αυτή τη συνάρτηση περνώντας το όνομα του αντικειμένου μαζί με την αναφορά 'studentResultFunc'. Η συνάρτηση «studentFail» εκχωρείται εκ νέου στον δείκτη « studentResultFunc». Κάτω από αυτό, επικαλούμαστε αυτήν τη μέθοδο δίνοντας την αναφορά 'carEngineFunc' και το όνομα του αντικειμένου.

Τώρα, και οι δύο συναρτήσεις καλούνται εδώ και αποδίδονται οι δηλώσεις που συμπεριλάβαμε σε αυτές τις συναρτήσεις.

Κωδικός 4:

#include

χρησιμοποιώντας το namespace std ;

τάξη MyNewStudent {

δημόσιο :

κενός studentPass ( ) {

cout << «Το φοιτητικό πάσο» << endl ;

}

κενός φοιτητήςΑποτυχία ( ) {

cout << «Ο μαθητής αποτυγχάνει» << endl ;

}

} ;

ενθ κύριος ( ) {

κενός ( MyNewStudent ::* studentResultFunc ) ( ) ;

MyNewStudent myStd_obj ;

studentResultFunc = & MyNewStudent :: studentPass ;

( myStd_obj. * studentResultFunc ) ( ) ;

studentResultFunc = & MyNewStudent :: φοιτητήςΑποτυχία ;

( myStd_obj. * studentResultFunc ) ( ) ;

ΕΠΙΣΤΡΟΦΗ 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

χρησιμοποιώντας το namespace std ;

κλάση SampleClass ;

typedef κενός ( SampleClass ::* MyFunc ) ( ) ;

typedef κενός ( * MyFuncPtr ) ( ) ;

κλάση SampleClass {

όνομα συμβολοσειράς ;

MyFunc f ;

δημόσιο :

SampleClass ( συνθ απανθρακώνω * όνομα )

: όνομα ( όνομα ) ,

φά ( & SampleClass :: myFunc_1 )

{ }

κενός myFunc_1 ( ) { cout << όνομα << 'Καλέσαμε το fuction 1 εδώ' << endl ; }

κενός myFunc_2 ( ) { cout << όνομα << 'Εδώ καλέσαμε τη συνάρτηση 2' << endl ; }

κενός func ( ) {

( Αυτό ->* φά ) ( ) ;

}

} ;

κενός myFunc_1 ( ) { cout << 'Η πρώτη λειτουργία' << endl ; }

κενός myFunc_2 ( ) { cout << 'Η δεύτερη λειτουργία' << endl ; }

ενθ κύριος ( )

{

MyFunc f = & SampleClass :: myFunc_2 ;

MyFuncPtr fp = myFunc_1 ;

SampleClass α ( 'πρώτο -' ) , σι ( 'δεύτερο -' ) ;

( ένα. * φά ) ( ) ;

σι. func ( ) ;

fp ( ) ;

}

Παραγωγή:

Το αποτέλεσμα του κώδικα αποδίδεται τώρα εδώ, το οποίο αποδίδει το αποτέλεσμα ανάλογα όπως ονομάσαμε τις συναρτήσεις στον κώδικά μας.

συμπέρασμα

Εξερευνήσαμε ότι οι «δείκτες συνάρτησης μέλους» στη C++ διευκολύνουν τη δυναμική δέσμευση, την ενθυλάκωση της συμπεριφοράς και τον ευέλικτο χειρισμό της επίκλησης συνάρτησης στο πλαίσιο του OOP. Μάθαμε ότι η χρήση των «δείκτες συνάρτησης μέλους» μπορεί να βελτιώσει σημαντικά την αρθρωτή και ευελιξία των βάσεων κωδικών C++, παρέχοντας ένα ισχυρό εργαλείο για την αντιμετώπιση πολλών προκλήσεων σχεδιασμού και χρόνου εκτέλεσης.