Comment utiliser la méthode d'un objet pour mettre à jour l'attribut d'un autre objet?

StackOverflow https://stackoverflow.com/questions/113033

  •  02-07-2019
  •  | 
  •  

Question

J'ai trois classes (C ++): Player, Hand et Card.

Le joueur a un membre, main, qui tient une main. Il possède également une méthode, getHand (), qui renvoie le contenu de hand.

Hand Player::getHand() {
    return hand;
}

La main a une méthode, addCard (Carte c), qui ajoute une carte à la main.

Je veux faire ceci:

player1.getHand (). addCard (c);

mais ça ne marche pas. Ça ne jette pas d'erreur, alors ça fait quelque chose. Mais si j’examine ensuite le contenu de la main de player1, la carte n’a pas été ajoutée.

Comment puis-je le faire fonctionner?

Était-ce utile?

La solution

Si getHand () ne renvoie pas de référence, vous aurez des problèmes.

Autres conseils

Si getHand () renvoie par valeur, vous modifiez une copie de la main et non l'original.

Une méthode Player.addCardToHand () n’est pas déraisonnable si vous n’avez aucune raison d’exposer une main. C’est probablement idéal à certains égards, car vous pouvez toujours fournir des copies de la main pour les comparaisons de vérification des gains, et personne ne peut les modifier.

Votre méthode doit renvoyer un pointeur ou une référence à l'objet Hand du joueur. Vous pouvez ensuite l'appeler comme suit: "player1.getHand () - > addCard (c)". Notez que c'est la syntaxe que vous utiliseriez si c'était un pointeur.

Renvoie une référence à l'objet hand, par exemple.

Hand &Player::getHand() {
    return hand;
}

Votre fonction addCard () opère maintenant sur le bon objet.

Quelle est la déclaration de getHand ()? Renvoie-t-il une nouvelle valeur Hand ou renvoie-t-il une valeur Hand & amp; référence?

Comme cela a été dit, vous modifiez probablement une copie au lieu de l'original.

Pour éviter ce type d'erreur, vous pouvez explicitement déclarer les constructeurs de copie et les opérateurs équivalents comme privés.

  private:
    Hand(const Hand& rhs);
    Hand& operator=(const Hand& rhs);

getX () est souvent le nom d’une fonction d’accesseur pour le membre x, similaire à votre propre utilisation. Cependant, un " getX " accessor est également très souvent une fonction en lecture seule, de sorte qu’il peut être surprenant dans d’autres situations de votre base de code de voir un appel à "getX". qui modifie X.

Je suggère donc, au lieu d'utiliser simplement une référence en tant que valeur de retour, de modifier un peu la conception du code. Quelques alternatives:

  • Exposez une méthode getMutableHand qui renvoie un pointeur (ou une référence). En renvoyant un pointeur, vous suggérez fortement que l'appelant utilise la notation du pointeur pour que toute personne lisant le code voie que cette variable change de valeur et n'est pas en lecture seule.
  • Faites de Player une sous-classe de la main , de sorte que tout ce qui manipule une main fonctionne également directement sur le lecteur. Intuitivement, vous pouvez dire qu'un joueur n'est pas une main, mais qu'il a fonctionnellement la bonne relation - chaque joueur a exactement une main et il semble que vous souhaitiez pouvoir avoir le même accès à une main via le même joueur que vous. serait directement.
  • Implémentez directement une méthode addCard pour votre classe de lecteur.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top