Adresse d'une fonction membre d'une classe [Résolu]

gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention - 2 janv. 2005 à 16:53 - Dernière réponse : xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention
- 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!
Afficher la suite 

Votre réponse

14 réponses

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

Cordialement,
Xterminhate.

Merci xterminhate 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de xterminhate
plus_plus_fab 232 Messages postés vendredi 9 janvier 2004Date d'inscription 8 janvier 2005 Dernière intervention - 2 janv. 2005 à 18:01
0
Merci
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)
Commenter la réponse de plus_plus_fab
gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention - 2 janv. 2005 à 18:24
0
Merci
Tu peux m'expliquer ces adaptateurs de fonction membre?
Commenter la réponse de gagah1
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 2 janv. 2005 à 18:25
0
Merci
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
Commenter la réponse de cs_DARKSIDIOUS
cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention - 2 janv. 2005 à 19:42
0
Merci
salut,
sinon mets ta fonction fn en static, et normalement t'auras plus de problemes.
class CXx
{
public:
.......
static int fn(int);
.....
};


a++ ;)
Commenter la réponse de cosmobob
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 2 janv. 2005 à 20:51
0
Merci
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?
Commenter la réponse de vecchio56
gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention - 2 janv. 2005 à 22:41
0
Merci
Merci pour ce petit débat très instructif.
Commenter la réponse de gagah1
ymca2003 2070 Messages postés mardi 22 avril 2003Date d'inscription 3 juillet 2006 Dernière intervention - 3 janv. 2005 à 09:35
0
Merci
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;


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

Cordialement,
Xterminhate.
Commenter la réponse de xterminhate
gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention - 3 janv. 2005 à 22:20
0
Merci
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.
Commenter la réponse de gagah1
gagah1 509 Messages postés samedi 28 juin 2003Date d'inscription 3 août 2010 Dernière intervention - 4 janv. 2005 à 08:53
0
Merci
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.
Commenter la réponse de gagah1
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 4 janv. 2005 à 09:02
0
Merci
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.
Commenter la réponse de xterminhate

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.