3 votes

C++ - Méthode qui prend un pointeur mais reçoit un entier

Je me demande comment je pourrais gérer un appel à une fonction lorsque un entier est passé à une fonction qui accepte un pointeur ? Dans mon cas, hasPlayedInTeam() accepte un pointeur vers Team, cependant, il reçoit un entier. Cela provoque le blocage du Q_ASSERT.

De plus, mon problème est-il aussi connu sous le nom de pointeur nul ? Mon professeur a utilisé ce terme plusieurs fois en cours, mais je ne suis pas sûr de ce à quoi il faisait référence.

//main.cpp
Personne p1("Jack", 22, "UCLA");
Q_ASSERT(p1.hasPlayedInTeam(0) == false);

//person.cpp
bool Personne::hasPlayedInTeam(Team *pTeam) {
  bool temp = false;
  foreach (Team* team, teamList) {
    if (team->getName() == pTeam->getName() {
      temp = true;
    }
  }
  return temp;
}

7voto

sergio Points 52422

Dans votre appel :

p1.hasPlayedInTeam(0)

le littéral entier 0 est converti en pointeur NULL. Donc, vous ne "recevez" pas réellement un entier ; vous passez un entier, le compilateur peut automatiquement le convertir en pointeur nul (étant donné la définition de NULL).

Je pense que vous pouvez corriger la définition de hasPlayedInTeam en affirmant que son argument n'est pas NULL, ou en renvoyant une valeur par défaut lorsque NULL est passé :

//person.cpp
bool Person::hasPlayedInTeam(Team *pTeam) {
    assert(pTeam!=NULL); //-- dans ce cas, votre programme va provoquer un assert et s'arrêter

ou :

//person.cpp
bool Person::hasPlayedInTeam(Team *pTeam) {
    if (pTeam == NULL)
         return false; //-- dans ce cas, votre programme ne fera pas d'assert et continuera avec une valeur de retour sensée (cela dépend en réalité de comment vous définissez "sensée")

2voto

ktodisco Points 2565

Oui, cela ressemble à un problème de pointeur nul. Un pointeur nul signifie que vous avez un pointeur qui ne pointe en fait sur rien:

Team* team = NULL;

Il se trouve qu'en C++, NULL est un macro pour l'entier 0. Stroustrup a quelques commentaires sur celui qu'il préfère utiliser dans le code.

1voto

Nandkumar Tekale Points 8534

La fonction hasPlayedInTeam() recherche l'argument de type "Team" alors que vous passez l'argument de type "integer" ce qui est incorrect....

1voto

Patrunjel Points 131

Oui, je pense que vous faites référence à un pointeur nul dans cette situation.

Pour traiter le cas où un int est passé, vous pouvez surcharger la fonction et la faire se comporter comme vous le souhaitez lorsque un int est passé.

1voto

GuyGreer Points 4240

En C ++, il y a NULL qui est défini comme 0 (dans certains fichiers d'en-tête standard, cstddef je pense), donc oui l'entier que vous passez est le pointeur nul. 0 est le seul (autant que je sache) entier qui sera automatiquement (implicitement) converti en un pointeur du type requis.

En pratique, je pense que la plupart des gens préfèrent utiliser NULL au lieu de 0 pour le pointeur nul.

Je ne suis pas sûr pourquoi cela coince cependant, le déréférencement du pointeur NULL (dans votre déclaration pTeam->getName()) devrait faire planter le programme si vous lui passez NULL, pas juste le bloquer.

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