appel non conforme d'une fonction membre non static
4 réponses
Eric
Bonjour !
Débutant en C++, j'ai ecris deux classes, l'une pour gerer les grands
nombres (superint) et une autre pour faire des calculs avec (crypt).
sint est un type correspondant a un tres grand entier definie dans superint
Or a la compilation, j'obtiens: error C2352: 'Crypt::cryptmsg' : appel non conforme d'une fonction membre non static class Crypt { public: char *cryptmsg(const char msg[], sint&, sint& );
Le message du compilateur dit que la fonction appelée ainsi doit être statique. En fait, une fonction membre d'une classe comme cette fonction cryptmsg() n'a d'existence que si il y a une instanciation de ta classe sur laquelle travailler, c'est à dire si dans le mail il y a un Crypt C1; puis après C1.cryptmsg(msg, cle1, cle2);
Une fonction membre a besoin pour travailler d'un pointeur this, qui désigne l'objet Crypt courant à partir duquel elle est appelée et ainsi elle pourra faire les modifications dont elle a besoin et utiliser les membres privés protected ou public dont elle a besoin dans la classe ; ces membres existent et ont une valeur que le programmeur peut déterminer à ce moment de l'execution.
Si la fonction telle que cette fonction cryptmsg() n'a pas besoin des autres membres privés ou publics de la classe (autres membres non statics) alors si elle a sa place dans la classe elle doit être static. Cela signifie qu'elle ne dépendra d'aucune instanciation de la classe, et pourra même être appelé avant toute instanciation.
class crypt { public: static char* cryptmsg(const char[], sint&, sint &); [...] };
À partir de là, cryptmsg pourra être appelée par crypt::cryptmsg(...); La restriction que ca apporte est que tout membre de la classe qu'elle utilise doit être static. Pour donner un exemple d'utilisation qui plait aux profs de mon école de variables et de fonctions statics, c'est de compter le nombre d'instanciation de la classe dans un programme : <Exemple bidon>
class Nb { static int nbinst; int monnombre; public: Nb() { nbinst++; } static int combien() { return nbinst; } };
int Nb::nbinst = 0; </Exemple>
En fait, là la variable nbinst est mise à 0 et sera incrémentée à chaque construction de Nb. La fonction combien() retourne ce membre qui est privé, et cette fonction combien() peut etre appelée en dehors de toute instance de Nb, car de toute facon nbinst est crée à l'execution du programme, et est mise à 0 comme demandé, et elle existera jusqu'à la fin du programme. Par contre, il est HORS DE QUESTION que la fonction combien() modifie la variable monnombre, laquelle modifierait-elle ? pour avoir une variable monnombre il faut avoir une instance de Nb et donc un pointeur this, et comme cette fonction static ne connait pas de pointeur this, ca ne va pas. Voilà, après je ne sais pas si cette fonction cryptmsg doit ou pas être static, vu qu'il n'y avait pas son code, mais je pense avoir donné un début (peut etre incomplet) de réponse pour pouvoir choisir si elle doit l'être ou pas.
Anthony -- "I should have seen it would be this way I should have known from the start what she's up to When you have loved and you've lost someone You know what it feels like to lose" -- The Rasmus
Or a la compilation, j'obtiens: error C2352: 'Crypt::cryptmsg' : appel non
conforme d'une fonction membre non static
class Crypt
{
public:
char *cryptmsg(const char msg[], sint&, sint& );
Le message du compilateur dit que la fonction appelée ainsi doit être
statique.
En fait, une fonction membre d'une classe comme cette fonction cryptmsg()
n'a d'existence que si il y a une instanciation de ta classe sur laquelle
travailler, c'est à dire si dans le mail il y a un Crypt C1; puis après
C1.cryptmsg(msg, cle1, cle2);
Une fonction membre a besoin pour travailler d'un pointeur this, qui désigne
l'objet Crypt courant à partir duquel elle est appelée et ainsi elle pourra
faire les modifications dont elle a besoin et utiliser les membres privés
protected ou public dont elle a besoin dans la classe ; ces membres
existent et ont une valeur que le programmeur peut déterminer à ce moment
de l'execution.
Si la fonction telle que cette fonction cryptmsg() n'a pas besoin des autres
membres privés ou publics de la classe (autres membres non statics) alors
si elle a sa place dans la classe elle doit être static. Cela signifie
qu'elle ne dépendra d'aucune instanciation de la classe, et pourra même
être appelé avant toute instanciation.
class crypt {
public:
static char* cryptmsg(const char[], sint&, sint &);
[...]
};
À partir de là, cryptmsg pourra être appelée par crypt::cryptmsg(...); La
restriction que ca apporte est que tout membre de la classe qu'elle utilise
doit être static.
Pour donner un exemple d'utilisation qui plait aux profs de mon école de
variables et de fonctions statics, c'est de compter le nombre
d'instanciation de la classe dans un programme :
<Exemple bidon>
class Nb {
static int nbinst;
int monnombre;
public:
Nb() { nbinst++; }
static int combien() { return nbinst; }
};
int Nb::nbinst = 0;
</Exemple>
En fait, là la variable nbinst est mise à 0 et sera incrémentée à chaque
construction de Nb. La fonction combien() retourne ce membre qui est privé,
et cette fonction combien() peut etre appelée en dehors de toute instance
de Nb, car de toute facon nbinst est crée à l'execution du programme, et
est mise à 0 comme demandé, et elle existera jusqu'à la fin du programme.
Par contre, il est HORS DE QUESTION que la fonction combien() modifie la
variable monnombre, laquelle modifierait-elle ? pour avoir une variable
monnombre il faut avoir une instance de Nb et donc un pointeur this, et
comme cette fonction static ne connait pas de pointeur this, ca ne va pas.
Voilà, après je ne sais pas si cette fonction cryptmsg doit ou pas être
static, vu qu'il n'y avait pas son code, mais je pense avoir donné un début
(peut etre incomplet) de réponse pour pouvoir choisir si elle doit l'être
ou pas.
Anthony
--
"I should have seen it would be this way
I should have known from the start what she's up to
When you have loved and you've lost someone
You know what it feels like to lose" -- The Rasmus
Or a la compilation, j'obtiens: error C2352: 'Crypt::cryptmsg' : appel non conforme d'une fonction membre non static class Crypt { public: char *cryptmsg(const char msg[], sint&, sint& );
Le message du compilateur dit que la fonction appelée ainsi doit être statique. En fait, une fonction membre d'une classe comme cette fonction cryptmsg() n'a d'existence que si il y a une instanciation de ta classe sur laquelle travailler, c'est à dire si dans le mail il y a un Crypt C1; puis après C1.cryptmsg(msg, cle1, cle2);
Une fonction membre a besoin pour travailler d'un pointeur this, qui désigne l'objet Crypt courant à partir duquel elle est appelée et ainsi elle pourra faire les modifications dont elle a besoin et utiliser les membres privés protected ou public dont elle a besoin dans la classe ; ces membres existent et ont une valeur que le programmeur peut déterminer à ce moment de l'execution.
Si la fonction telle que cette fonction cryptmsg() n'a pas besoin des autres membres privés ou publics de la classe (autres membres non statics) alors si elle a sa place dans la classe elle doit être static. Cela signifie qu'elle ne dépendra d'aucune instanciation de la classe, et pourra même être appelé avant toute instanciation.
class crypt { public: static char* cryptmsg(const char[], sint&, sint &); [...] };
À partir de là, cryptmsg pourra être appelée par crypt::cryptmsg(...); La restriction que ca apporte est que tout membre de la classe qu'elle utilise doit être static. Pour donner un exemple d'utilisation qui plait aux profs de mon école de variables et de fonctions statics, c'est de compter le nombre d'instanciation de la classe dans un programme : <Exemple bidon>
class Nb { static int nbinst; int monnombre; public: Nb() { nbinst++; } static int combien() { return nbinst; } };
int Nb::nbinst = 0; </Exemple>
En fait, là la variable nbinst est mise à 0 et sera incrémentée à chaque construction de Nb. La fonction combien() retourne ce membre qui est privé, et cette fonction combien() peut etre appelée en dehors de toute instance de Nb, car de toute facon nbinst est crée à l'execution du programme, et est mise à 0 comme demandé, et elle existera jusqu'à la fin du programme. Par contre, il est HORS DE QUESTION que la fonction combien() modifie la variable monnombre, laquelle modifierait-elle ? pour avoir une variable monnombre il faut avoir une instance de Nb et donc un pointeur this, et comme cette fonction static ne connait pas de pointeur this, ca ne va pas. Voilà, après je ne sais pas si cette fonction cryptmsg doit ou pas être static, vu qu'il n'y avait pas son code, mais je pense avoir donné un début (peut etre incomplet) de réponse pour pouvoir choisir si elle doit l'être ou pas.
Anthony -- "I should have seen it would be this way I should have known from the start what she's up to When you have loved and you've lost someone You know what it feels like to lose" -- The Rasmus
Eric
Anthony Fleury" a écrit dans le message de news:406c27fc$0$13345$
En fait, une fonction membre d'une classe comme cette fonction cryptmsg() n'a d'existence que si il y a une instanciation de ta classe sur laquelle travailler, c'est à dire si dans le mail il y a un Crypt C1; puis après C1.cryptmsg(msg, cle1, cle2); Si la fonction telle que cette fonction cryptmsg() n'a pas besoin des autres
membres privés ou publics de la classe (autres membres non statics) alors si elle a sa place dans la classe elle doit être static. Cela signifie qu'elle ne dépendra d'aucune instanciation de la classe, et pourra même être appelé avant toute instanciation.
Merci beaucoup pour ton eclairage. Ma reponse va paraitre un peu primaire: ca ne marche pas ! Ma classe crypt est en fait un regroupement de fonctions, mais ne contient pas de valeurs !
Mon compilateur me dit apres corrections: c:Documents and SettingsEricMes documentsProjets Visual StudioRSARSAcrypt.cpp(5): error C2724: 'Crypt::codechar' : 'static' ne doit pas être utilisé sur les fonctions membres définies au niveau de la portée du fichier c:Documents and SettingsEricMes documentsProjets Visual StudioRSARSAcrypt.cpp(12): error C2724: 'Crypt::cryptmsg' : 'static' ne doit pas être utilisé sur les fonctions membres définies au niveau de la portée du fichier c:Documents and SettingsEricMes documentsProjets Visual StudioRSARSAcrypt.cpp(27): error C2724: 'Crypt::decodechar' : 'static' ne doit pas être utilisé sur les fonctions membres définies au niveau de la portée du fichier
Merci
Eric
#include "crypt.h"
static sint Crypt::codechar(const char &caractere, sint &e, sint &n)
{
sint val = sint(caractere);
return (val^e)%n;
}
static char *Crypt::cryptmsg(const char msg[], sint &e, sint &n)
{
//chaine de retour
char *cryptedmsg = new char [strlen(msg)*n.GetLenString()];
Anthony Fleury" <fleury_anthony@hotmail_.com> a écrit dans le message de
news:406c27fc$0$13345$626a14ce@news.free.fr...
En fait, une fonction membre d'une classe comme cette fonction cryptmsg()
n'a d'existence que si il y a une instanciation de ta classe sur laquelle
travailler, c'est à dire si dans le mail il y a un Crypt C1; puis après
C1.cryptmsg(msg, cle1, cle2);
Si la fonction telle que cette fonction cryptmsg() n'a pas besoin des
autres
membres privés ou publics de la classe (autres membres non statics) alors
si elle a sa place dans la classe elle doit être static. Cela signifie
qu'elle ne dépendra d'aucune instanciation de la classe, et pourra même
être appelé avant toute instanciation.
Merci beaucoup pour ton eclairage.
Ma reponse va paraitre un peu primaire: ca ne marche pas !
Ma classe crypt est en fait un regroupement de fonctions, mais ne contient
pas de valeurs !
Mon compilateur me dit apres corrections:
c:Documents and SettingsEricMes documentsProjets Visual
StudioRSARSAcrypt.cpp(5): error C2724: 'Crypt::codechar' : 'static' ne
doit pas être utilisé sur les fonctions membres définies au niveau de la
portée du fichier
c:Documents and SettingsEricMes documentsProjets Visual
StudioRSARSAcrypt.cpp(12): error C2724: 'Crypt::cryptmsg' : 'static' ne
doit pas être utilisé sur les fonctions membres définies au niveau de la
portée du fichier
c:Documents and SettingsEricMes documentsProjets Visual
StudioRSARSAcrypt.cpp(27): error C2724: 'Crypt::decodechar' : 'static' ne
doit pas être utilisé sur les fonctions membres définies au niveau de la
portée du fichier
Merci
Eric
#include "crypt.h"
static sint Crypt::codechar(const char &caractere, sint &e, sint &n)
{
sint val = sint(caractere);
return (val^e)%n;
}
static char *Crypt::cryptmsg(const char msg[], sint &e, sint &n)
{
//chaine de retour
char *cryptedmsg = new char [strlen(msg)*n.GetLenString()];
Anthony Fleury" a écrit dans le message de news:406c27fc$0$13345$
En fait, une fonction membre d'une classe comme cette fonction cryptmsg() n'a d'existence que si il y a une instanciation de ta classe sur laquelle travailler, c'est à dire si dans le mail il y a un Crypt C1; puis après C1.cryptmsg(msg, cle1, cle2); Si la fonction telle que cette fonction cryptmsg() n'a pas besoin des autres
membres privés ou publics de la classe (autres membres non statics) alors si elle a sa place dans la classe elle doit être static. Cela signifie qu'elle ne dépendra d'aucune instanciation de la classe, et pourra même être appelé avant toute instanciation.
Merci beaucoup pour ton eclairage. Ma reponse va paraitre un peu primaire: ca ne marche pas ! Ma classe crypt est en fait un regroupement de fonctions, mais ne contient pas de valeurs !
Mon compilateur me dit apres corrections: c:Documents and SettingsEricMes documentsProjets Visual StudioRSARSAcrypt.cpp(5): error C2724: 'Crypt::codechar' : 'static' ne doit pas être utilisé sur les fonctions membres définies au niveau de la portée du fichier c:Documents and SettingsEricMes documentsProjets Visual StudioRSARSAcrypt.cpp(12): error C2724: 'Crypt::cryptmsg' : 'static' ne doit pas être utilisé sur les fonctions membres définies au niveau de la portée du fichier c:Documents and SettingsEricMes documentsProjets Visual StudioRSARSAcrypt.cpp(27): error C2724: 'Crypt::decodechar' : 'static' ne doit pas être utilisé sur les fonctions membres définies au niveau de la portée du fichier
Merci
Eric
#include "crypt.h"
static sint Crypt::codechar(const char &caractere, sint &e, sint &n)
{
sint val = sint(caractere);
return (val^e)%n;
}
static char *Crypt::cryptmsg(const char msg[], sint &e, sint &n)
{
//chaine de retour
char *cryptedmsg = new char [strlen(msg)*n.GetLenString()];
"Anthony Fleury" a écrit dans le message de news:406c27fc$0$13345$
J'ai mofifié comme tu m'avais dit, mais j'ai indiqué static dans la declaration de la classe, mais pas dans la definition des fonctions de ma classe.
Et ca se compile...
Merci
Eric
Anthony Fleury
Eric wrote:
J'ai mofifié comme tu m'avais dit, mais j'ai indiqué static dans la declaration de la classe, mais pas dans la definition des fonctions de ma classe.
Et ca se compile...
Oups pardon, erreur de ma part en effet... merci le copier/coller ! :) static utilisé dans le cas de fonction dans le .cpp a un autre sens... Anthony -- "I should have seen it would be this way I should have known from the start what she's up to When you have loved and you've lost someone You know what it feels like to lose" -- The Rasmus
Eric wrote:
J'ai mofifié comme tu m'avais dit, mais j'ai indiqué static dans la
declaration de la classe, mais pas dans la definition des fonctions de ma
classe.
Et ca se compile...
Oups pardon, erreur de ma part en effet... merci le copier/coller ! :)
static utilisé dans le cas de fonction dans le .cpp a un autre sens...
Anthony
--
"I should have seen it would be this way
I should have known from the start what she's up to
When you have loved and you've lost someone
You know what it feels like to lose" -- The Rasmus
J'ai mofifié comme tu m'avais dit, mais j'ai indiqué static dans la declaration de la classe, mais pas dans la definition des fonctions de ma classe.
Et ca se compile...
Oups pardon, erreur de ma part en effet... merci le copier/coller ! :) static utilisé dans le cas de fonction dans le .cpp a un autre sens... Anthony -- "I should have seen it would be this way I should have known from the start what she's up to When you have loved and you've lost someone You know what it feels like to lose" -- The Rasmus