Adresse d'une fonction membre d'une classe

Résolu
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010 - 2 janv. 2005 à 16:53
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009 - 4 janv. 2005 à 09:02
Salut à tous!

Je voudrais avoir l'adresse mémoire d'une fonction membre d'une classe, alors que l'ISO C++ l'interdire l'accès.
Je m'explique:
J'ai une classe exemple:
class CXx
{
public:
.......
int fn(int);
.....
};

et j'ai une déclaration de fonction:

int (*fnglobal)(int);
et une classe

CXx classeX;

et quand je veux recuperer l'adresse :
fnglobal = &classeX.fn;

le compilateur m'envoie une erreur:
>>ISO C++ interdire l'accès de l'adresse mémoire d'une membre de la classe CXx.
Donc comment je fais pour avoir cette adresse mémoire? Merci!

14 réponses

xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 janv. 2005 à 22:36
Tu connais la notion de polymorphisme ?

Cordialement,
Xterminhate.
3
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
2 janv. 2005 à 18:01
C'est pas possible, le typage est trop fort !
Si ça l'était, tu pourrais parvenir à violer l'encapsulation.
Tu veux t'en servir pour l'appeler autrement que depuis un objet ?
Dans ce cas voir les adaptateurs de fonction membre (mem_fun, mem_fun_ref)
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
2 janv. 2005 à 18:24
Tu peux m'expliquer ces adaptateurs de fonction membre?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
2 janv. 2005 à 18:25
Non seulement c'est déconseillé (il faut se rappeller qu'il s'agit de classe, et donc, la classe doit être instanciée pour pouvoir accèder à ses membres, et donc, les adresses sont toujours modifiées) mais c'est interdit !

Il vaux mieux passer par une fonction assistante de la classe, en dehors de celle-ci, qui puisse faire ce que tu veux. Tu peux par exemple lui passer un pointeur vers l'objet voulut...
_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
2 janv. 2005 à 19:42
salut,
sinon mets ta fonction fn en static, et normalement t'auras plus de problemes.
class CXx
{
public:
.......
static int fn(int);
.....
};


a++ ;)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 janv. 2005 à 20:51
Ce serait illogique de faire un truc comme ca, puisqu'il n'y aurait pas de this... ou alors ya un truc que j'ai pas compris
Comment appellerais tu fnglobal?
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
2 janv. 2005 à 22:41
Merci pour ce petit débat très instructif.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 janv. 2005 à 09:35
C'est ça que tu veux faire ?

#include <stdio.h>
#include <stdlib.h>

class MyClass
{


public:


int MyMethod(int a) {return 2*a;}


};


typedef int (MyClass::*PFN)(int);


int main(int argc, char* argv[])


{


MyClass obj;


PFN pfn = MyClass::MyMethod;


printf("%d\n", (obj.*pfn)(2));


return 0;


}
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
3 janv. 2005 à 11:56
Je veux que PFN ne depend pas de MyClass , juste un pointeur d'une fonction globale comme j'ai précisé au-debut.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 janv. 2005 à 11:58
Alors là c'est pas possible si elle est pas static, les fct membres des classes necissitent un objet pour les appeler...
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 janv. 2005 à 13:13
Pourquoi tu ne veux pas passer par une instance de classe ? Ton besoin n'est pas clair, ta conception objet encore moins.

Cordialement,
Xterminhate.
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
3 janv. 2005 à 22:20
Donc voici mon projet:
J'ai 8 classes et dans chaque classe il y a 2 fonctions membre nommée: int fn(int); et int test();

class Myclass1
{public:
int fn(int a) {return a*a;}
int test();
};
class Myclass2
{public:
int fn(int a){return a*2;}
int test();
};
...etc
et j'ai une declaration de fonction globale:
int (*fnglobal)(int);

maintenant j'essaie de faire un test à chaque classe pour savoir la valeur minimum entre les fonction test();
et je veux recuperer l'adresse memoire de la fonction int fn(int) de la fonction membre de la classe qui aura la valeur test minimum que je garderai dans fnglobal pour une utilisation ulterieur. Donc comment je vais faire? Merci.
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
4 janv. 2005 à 08:53
J'ai pas pensé depuis le debut.(Polymorphisme d'un objet) Merci de me rappeler. Après je prends le bout de code de ymca2003.
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
4 janv. 2005 à 09:02
Voila, tu fais une classe de base :

struct MyClasseInterface
{
virtual int test() = 0;
virtual int fn() = 0;
}

Et tu fais hériter publiquement toutes tes classes de MyClasseInterface. Ensuite tu peux manipuler des pointeurs MyClasseInterface* pour acceder aux instances et aux fonctions membres des classes dérivées....

Exemple :

MyClasse1 c1;
MyClasseInterface* pc = &c1;
int resultat_test = pc->test();
int resultat_fn = pc->fn(...);

Cordialement,
Xterminhate.
0
Rejoignez-nous