OVH Cloud OVH Cloud

re : tableau de pointeurs de fonctions

11 réponses
Avatar
sentenza
slt,

Pr ne pas utiliser des if () else if() ... j'ai besoin d'utiliser un
tableau de pointeur de fonction.
Comment fait ton pour construir un tableau de pointeur de fonction qui
pointe vers des methodes d'une classe ?

ce que j'ai essaye de faire, mais sans succes :

template<typename T>
class MaClass
{
private:
std::auto_ptr< Container<T> > m_container;
public:
explicit MaClass(std::list<T> * stlContainer)
:m_container(new StlAdaptor< std::list<T> >(stlContainer)){ }

explicit MaClass(std::set<T> * stlContainer)
:m_container(new StlAdaptorSet< std::set<T> >(stlContainer)){ }

explicit MaClass(std::vector<T> * stlContainer)
:m_container(new StlAdaptor< std::vector<T> >(stlContainer)){ }

void Add(const T & value) { m_container->Add(value); }
void Sub(const T & value) { m_container->Sub(value); }
void Pop() { m_container->Pop(); }
};

struct t_functab
{
char *str;
void (MaClass::*f)();
};

t_functab functab[] = {
{"Add", MaClass::Add},
{"Sub", MaClass::Sub},
{"Pop", MaClass::Pop},
{0, 0};
};

c'est surement pas comme ca que l'on fait mais je n'ai trouve aucuns
renseignements dans mes docs :/

desole avec mes questions bizard, mais je debute en c++ et la syntax
n'est pas toujours evidente ...

--
char sentenza9[] =
"\xeb\x0d\x5f\x31\xc0\x50\x89\xe2"
"\x52\x57\x54\xb0\x3b\xcd\x80\xe8"
"\xee\xff\xff\xff/bin/sh";

1 réponse

1 2
Avatar
kanze
"Le Géant Vert" wrote in message
news:<br79l9$6mb$...
"Benoit Rousseau" a écrit dans le message de
news: 3fd6e74f$0$300$
wrote:
sentenza wrote in message
news:<3fd5d94d$0$6970$...
template<typename T>
class MaClass
{
[...]



}
- Il faut que toutes les fonctions aient la même signature : tu

ne peux pas initialiser un « void (MaClass::*)() » avec
&MaClass::Add, parce que &MaClass::Add a le type « void
(MaClass::*)( T& ) ». La raison en est simple : comment est-ce
que tu compte utiliser le pointeur ? Si tu as :
void (MaClass<int>::*f)() = &MaClass<int>::Pop ;
il faut écrire :
(p->*f)() ;
sans paramètre. Si tu as :
void (MaClass<int>::*f)( int& ) = &MaClass<int>::Add ;
il faut écrire :
(p->*f)( 42 ) ;


Ca marche ça ? Il me semble avoir lu qu'on ne pouvait appeler que
les membres statiques de cette façon.


m'est avis que si la méthode était statique, on pourrait se contenter
d'un : (*f)(42);
hors là on fait bien un :
(p->*f)(42)


Si la fonction est statique, le type de son adresse est : void (*)(), et
non void (NomDeClasse::*)(). Donc :

void (*pf)() = &MaClasse::fonctionStatique ;
(*pf)() ;

mais :

MaClasse* p ;
void (MaClasse::*pmf)() = &MaClasse::functionNonStatique ;
(p->*pmf)() ;

Sans les pointeurs, on peut bien écrire :

p->fonctionStatique() ;

Avec les pointeurs, c'est impossible, et la raison en est simple : une
fonction statique s'appelle comme une fonction libre, sans pointeur de
this. Une fonction non statique s'appelle avec un pointeur this. La
séquence de l'appel est donc différent. Si j'écris
p->fonctionStatique(), le compilateur voit que c'est une fonction
statique, et ne passe pas de pointeur this, même s'il en a un.

Si je travaille avec des pointeurs à des fonctions, une fois que
j'aurais affecté &MaClasse::fonctionStatique à un void (MaClasse::*)(),
le compilateur ne peut plus savoir que la fonction est statique lors de
l'appel. Il génère donc la séquence de l'appel des fonctions
non-statiques ; au moins sur ma machine, ça ne va pas marcher.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16




1 2