Exemple de pointeurs de fonction

Contenu du snippet

Ce code source traite différents exemples de pointeurs de fonction :
-Pointeur de fonction
-Tableau de pointeurs de fonction
-Pointeur de méthode
-Tableau de pointeurs de méthode

Source / Exemple :


#include <iostream>

using namespace std;

class MyClass
{
public:
void aff1 ()const {cout << "1" << endl;}  // 5 méthodes aff
void aff2 ()const {cout << "2" << endl;}
void aff3 ()const {cout << "3" << endl;}
void aff4 ()const {cout << "4" << endl;}
void aff5 ()const {cout << "5" << endl;}
};

const void impr1(); //4 fonctions impr (implémentées après le main)
const void impr2();
const void impr3();
const void impr4();

typedef void (MyClass::*PFM)() const;  //Définition d'un type de pointeur de méthode

int main ()
{
cout << "********* Pointeur sur fonction ***********\n\n\n";

const void (*pt1)(); //Pointeur de fonction : pt1
pt1 = 0;

int get_choice = 0;

cout << "(1)impr1 - (2)impr2 - (3)impr3 - (4)impr4  : ";
cin  >> get_choice; //Demande une action à réaliser

switch (get_choice)
{
case 1:pt1 = &impr1;break; //pt1 pointe sur l'actin
case 2:pt1 = &impr3;break;
case 3:pt1 = &impr3;break;
default:pt1 = &impr4;break;
}

(*pt1)(); // execute la fonction à l'adresse pt1.

cout << ("\n\n\n\n");
cout<< "********* Tableau de pointeurs sur fonction ***********\n\n\n";
int MaxArray = 4;

const void (*ptfonc[MaxArray])(); //Tableau de pointeur de fonction : ptfonc

short get;

for (short i = 0; i < MaxArray; i++)
{
cout << "(0)Quitter - (1)impr1 - (2)impr2 - (3)impr3 - (4)impr4 : ";
cin >> get;
switch (get)
{
case 1:ptfonc[i] = &impr1;break;
case 2:ptfonc[i] = &impr3;break;
case 3:ptfonc[i] = &impr3;break;
case 4:ptfonc[i] = &impr4;break;
default: ptfonc[i] = 0;
}
}

cout << ("\n\n\n");

for (short i = 0; i < MaxArray; i++)
{
if (ptfonc[i] ==0)
continue;
cout << "  ";
(*ptfonc[i])();
}

cout << ("\n\n\n\n");
cout << "********* Pointeur sur fonction membre ***********\n\n\n";

void (MyClass::*ptf)() const; //Pointeur de méthode : ptf
ptf = 0;

MyClass *pClass2 = 0;

int choice = 0;

cout << "1:Aff1 - 2:Aff2 - 3:Aff3 - 4:Aff4 - 5:Aff5  :";
cin  >> choice;

switch (choice)
{
case 1: ptf = &MyClass::aff1;break; //Affecte la fonction membre à ptf
case 2: ptf = &MyClass::aff2;break;
case 3: ptf = &MyClass::aff3;break;
case 4: ptf = &MyClass::aff4;break;
case 5: ptf = &MyClass::aff5;break;
}

pClass2 = new MyClass;
(pClass2->*ptf)(); //Execute la fonction membre de Pt2 contenue à l'adresse ptf

cout << ("\n\n\n\n");
cout<< "********* Tableau de pointeurs sur fonction membre ***********\n\n\n";

 MaxArray = 5;

 //Tableau de Pointeur de méthode : ClassFuncs
PFM ClassFuncs [5] = 
{&MyClass::aff1,
 &MyClass::aff2,
 &MyClass::aff3,
 &MyClass::aff4,
 &MyClass::aff5 };

MyClass *pClass = 0;

int Method;

bool fQuit = false;

while (!fQuit)
{
cout << "0:Quitter - 1:Aff1 - 2:Aff2 - 3:Aff3 - 4:Aff4 - 5:Aff5  :";
cin >> Method;
if (Method <=0 || Method >= MaxArray+1)
{
fQuit = true;
}
else
{
pClass = new MyClass;
(pClass->*ClassFuncs[Method - 1])(); //Execute la méthode contenue à l'adresse [Method - 1]
delete pClass;
}
}

cout << ("\n\n\n");
system ("PAUSE");
return 0;
}

//Implémentation des fonctions :
const void impr1 () { cout << "1" << endl;}
const void impr2 () { cout << "2" << endl;}
const void impr3 () { cout << "3" << endl;}
const void impr4 () { cout << "4" << endl;}

Conclusion :


Les pointeurs de fonctions permettent de réduire le code mais sont délicats à utiliser.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.