Pointeur static sur fonction :)

Résolu
Signaler
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005
-
Certain reconnaitront surement le tutoriel en question. J'ai rajouté quelques trucs au gestionnaire d'exception, mais je bloque sur le point suivant:
Je n'arrive pas à initialiser un pointeur static, voila la class :

class CException : public std::exception
{
private:
static void (*reaction)(CException&); // le pointeur sur la fonction qui prend en paramètre une référence de CException.

public:
static void set_reaction(void (*fn)(CException&)) { reaction = fn; }
// la fonction pour changer ce pointeur
...

};

void CException::reaction = NULL; // et mon essai d'initialisation

Or le compileur refuse de compiler :)

J'ai essayer ca:
void CException::reaction(CException&) = NULL;

En fait, malgré les livres que j'ai sur les membres static et les sites internet, le pointeur de fonction ne pose pas de problème, mais le tout mélangé...

Merci d'avance pour ceux qui pourront m'aider :)

26 réponses

Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

"Or le compileur refuse de compiler :)"
Ca ne m'étonne pas :)

void (*CException::reaction)(CException&) = 0; // pas NULL en C++
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Ca aide pas mal de coder avec un bon bouquin de C/C++ a coté de soit.
N'hésites pas non plus a avoir un regard critique sur ton travail.
Exemple :

static void (*reaction)(CException&);
...
void CException::reaction = NULL;

Tu déclares un pointeur sur une fonction mais pourtant il ne figure nul part dans son affectation, d'ou la réponse de plus_plus_fab:

void (*CException::reaction)(CException&) = 0;

Essaye de rester logique et de ne pas faire semblant de comprendre ce que tu écris, ca t'éviteras beaucoup de soucis.

Shell
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Bon c'est vrai que je patoge dans la semoule avec leur gestionnaire, j'ai pas l'habitude. De plus, le pointeur de fonction n'est pas du tout intuitif :) Donc c'est vrai, c'est pas logique ce que j'ai écris, mais c'est mieux que rien dans le sens ou, j'espère toujours que les messages d'erreurs m'aideront.

Tient d'ailleurs je suis le seul, ou les messages d'erreur de DevC++ sont vraiment "nul" ? (4.9.8.0)

Et merci encore, ca marche impec.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
plus_plus_fab> Pas NULL en C++
Tu veux dire que NULL n'est pas cencé être défini quand on compile en C++?
Visual C++ le définit pourtant...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Ca pose un problème d'utiliser NULL ?
Moi je trouve ca beaucoup plus clair lorsqu'il s'agit d'initialiser des pointeurs.
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
si on fait int *p;
p = 0;

il n'y aura pas un warning du compilateur a propos du type ? (c'est pourquoi NULL est mieux cas il caste le 0 en (void*)0 et de plus je suis du meme avis : c'est beaucoups plus lisible).

Un deniere remarque, le C++ etant par definition compatible avec le C (oui car il est plus plus !), NULL existe aussi et marche tout autant.

Pourquoi faire simple quand on peut faire compliquer ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
"Pourquoi faire simple quand on peut faire compliquer ?"

S'il s'agit d'une signature, autant corriger la faute de conjugaison
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
Merci de me le faire remarquer.

Pourquoi faire simple quand on peut faire compliqué ?
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

en C++ le type de 0 est déterminé par le contexte. S'il s'agit d'un pointeur, cela indique qu'il ne pointe pas sur un objet. Cela est du au typage plus fort en C++ qu'en C.
En tout cas, Stroustrup le conseille.
en C, on utilise NULL.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
Sous Visual C++:
#define NULL 0
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
Dans stdio.h

/* Define NULL pointer value */

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

Donc tout depend si on fait ou nom du c ou C++

Pourquoi faire simple quand on peut faire compliqué ?
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

NULL est donc définie correctement, mais il ne faut pas oublier que les implémentations des librairies standard C et C++ varient selon les compilateurs.
Pas la peine de se voiler la face, s'il faut mettre 0, on met 0. ça evite d'avoir à vérifier que NULL est définie correctement ...
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
Mais justement c'est la tout le magie de la chose, il faut mettre NULL comme cela ca marhce dans tout les cas puisqu'il fait du C++, c'est donc defini comme 0, donc tout va pour le mieux dans le meilleurs des monde possible !

Pourquoi faire simple quand on peut faire compliqué ?
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Vecchio56> Tu parles francais comme une vache espagnoles (:
Il n'y avait pas de faute dans la signature de JCDjcd.
Règle simple : quand un verbe précéder un verbe a l'infinitif, il sera lui meme à l'infinitif!

JCDjcd> Tu peux écouter vecchio pour ses conseils en programmation, mais en francais prend plutot un dico.

Shell
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

je me cite :
"mais il ne faut pas oublier que les implémentations des librairies standard C et C++ varient selon les compilateurs."

"il faut mettre NULL comme cela ca marche dans tout les cas"
pas forcément donc.
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Hum...
Si c'est standard, rien ne varient!

Shell
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

je suis de l'avis de vecchio pour l'orthographe :)
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
LoOl,
Simple, il n'y a qu'à remplacer "compliquer" par un verbe du 3ième groupe et voir ce que ca donne ...

Avec "Vendre":

Quand on peut faire vendu ????
Je crois pas que ca se dise ca :/

Ca serait plutot :
Quand on peut faire vendre.

Quand je parlais de dico, je ne parlais pas de celui des mots tordus (:

Shell
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
Oui, je suis aussi assez sur de moi, compliqué est ici un adjectif
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

DeAtHCrAsH> et si, les "compilateurs" ont la liberté d'implémenter certaines parties des librairies standard comme bon leur semble. Le standard évolue, tout n'est pas parfait, et on va pas attendre 50 ans pour fixer un standard que personne n'utiliserai alors puisque tout le monde serait habitué à faire autrement.