59 votes

que signifie "error : a nonstatic member reference must be relative to a specific object" ?

int CPMSifDlg::EncodeAndSend(char *firstName, char *lastName, char *roomNumber, char *userId, char *userFirstName, char *userLastName)
{
    ...

    return 1;
}

extern "C"
{
    __declspec(dllexport) int start(char *firstName, char *lastName, char *roomNumber, char *userId, char *userFirstName, char *userLastName)
    {
        return CPMSifDlg::EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);
    }
}

En ligne return CPMSifDlg::EncodeAndSend J'ai une erreur : Erreur : une référence à un membre non statique doit être relative à un objet spécifique.

Qu'est-ce que cela signifie ?

71voto

Nawaz Points 148870

EncodeAndSend n'est pas une fonction statique, ce qui signifie qu'elle peut être appelée sur une instance de la classe CPMSifDlg . Tu ne peux pas écrire ça :

 CPMSifDlg::EncodeAndSend(/*...*/);  //wrong - EncodeAndSend is not static

On devrait plutôt l'appeler ainsi :

 CPMSifDlg dlg; //create instance, assuming it has default constructor!
 dlg.EncodeAndSend(/*...*/);   //correct

0 votes

Mais si je supprime le "CPMSifDlg", j'obtiens "error : identifier EncodeAndSend is undefined".

0 votes

Comme ceci, n'est-ce pas ? CPMSifDlg dlg; return dlg.EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName); il est indiqué que la méthode est inaccessible

0 votes

@OscarYuandinata : Oui. Vous devez créer une instance de la classe afin d'appeler la fonction. Ou alors, faites de la fonction une fonction membre statique, ou simplement une fonction libre.

15voto

Rohit Points 2629

Seules les fonctions statiques sont appelées avec le nom de la classe.

classname::Staicfunction();

Les fonctions non statiques doivent être appelées à l'aide d'objets.

classname obj;
obj.Somefunction();

C'est exactement ce que signifie votre erreur. Puisque votre fonction n'est pas statique, vous devez utiliser une référence d'objet pour l'invoquer.

0 votes

Je ne pense pas que cela soit tout à fait vrai. Si l'on appelle une méthode non statique d'une classe de base à partir d'une classe dérivée, on utilise la syntaxe Base::function().

0 votes

Si votre méthode dérivée n'est pas statique.

12voto

iammilind Points 29275

CPMSifDlg::EncodeAndSend() est déclarée comme non static et il doit donc être appelé en utilisant un objet de la classe CPMSifDlg . par exemple

CPMSifDlg obj;
return obj.EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);

Si EncodeAndSend n'utilise pas/ne met pas en relation les spécificités d'un objet (ex. this ) mais général pour le class CPMSifDlg puis le déclarer comme static :

class CPMSifDlg {
...
  static int EncodeAndSend(...);
  ^^^^^^
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X