Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

appel non conforme d'une fonction membre non static

4 réponses
Avatar
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

J'essaie de tester ma classe crypt:
void main()

{

sint cle1 = sint("6583");

sint cle2 = sint("9583");

char msg[] = "messsage";

std::cout << Crypt::cryptmsg(msg, cle1, cle2) << std::endl;

}

Or a la compilation, j'obtiens: error C2352: 'Crypt::cryptmsg' : appel non
conforme d'une fonction membre non static


Merci pour votre aide,

Eric

/****** Classe Crypt *********/

class Crypt

{

public:

char *cryptmsg(const char msg[], sint&, sint& );

char *decryptmsg(const char[], sint&, sint& );

private:

sint codechar(const char&, sint& , sint& );

char decodechar(sint&, sint& , sint& );

};

/***** classe Superint ******/

namespace superint

{

struct sint

{

sint(char*);

sint(const unsigned int);

sint(void);

sint(sint&);

operator char*();

operator unsigned int();

sint &operator=(const sint&);

sint &operator=(const char*);

sint &operator=(const unsigned int);

bool operator==(const sint&);

bool operator!=(const sint&);

bool operator<=(const sint&);

bool operator>=(const sint&);

bool operator<(const sint&);

bool operator>(const sint&);

sint &operator+(const sint&);

sint &operator+=(const sint&);

sint &operator-(const sint&);

sint &operator-=(const sint&);

sint &operator*(sint&);

sint &operator*=(sint&);

sint &operator/(sint&);

sint &operator/=(sint&);

sint &operator%(sint&);

sint &operator%=(sint&);

sint &operator^(sint&);

sint &operator^=(sint&);

sint &operator!();

char*GetString(char*a);

int GetLenString();

private:

char nbr[maxlen];

unsigned int len;

sint powdix(int puissance);

sint FoisOnce(int nb);

unsigned int lennb(unsigned int start);

};

};

4 réponses

Avatar
Anthony Fleury
Eric wrote:

Bonjour !

Bonjour,

[...]
std::cout << Crypt::cryptmsg(msg, cle1, cle2) << std::endl;

}

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 &);
[...]
};

static char* crypt::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

Avatar
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()];

//cryptage de chaque caractere

for (unsigned long i = 0; msg[i] != 0; i++)

{

sint cryptedchar = Crypt::codechar(msg[i], e, n);

cryptedchar.GetString(&cryptedmsg[8*i+8-cryptedchar.GetLenString()]);

}

return cryptedmsg;

}



static char Crypt::decodechar(sint &cryptedchar, sint &d , sint &n )

{

sint uncryptedchar = (cryptedchar^d)%n;


char tampon[3];

return (char)atoi(uncryptedchar.GetString(tampon));

}

Avatar
Eric
"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
Avatar
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