2008-09-22 22 views
3

J'ai trois classes (C++): Player, Hand et Card.Comment utiliser la méthode d'un objet pour mettre à jour l'attribut d'un autre objet?

Le joueur a un membre qui tient une main. Il a aussi une méthode, getHand(), qui retourne le contenu de la main. Hand a une méthode, addCard (Card c), qui ajoute une carte à la main.

Je veux faire.

player1.getHand() addCard (c);

mais cela ne fonctionne pas. Il ne génère pas d'erreur, donc il fait quelque chose. Mais si j'examine le contenu de la main du joueur1 par la suite, la carte n'a pas été ajoutée.

Comment puis-je faire fonctionner cela?

Répondre

1

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

+0

J'ai posté le code. Changement à Main & getHand (Main h) { main de retour; } l'a corrigé. Merci à tous! – rarbuthnot

+0

Heureux d'être utile –

2

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

0

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

0

Comme indiqué précédemment, vous modifiez probablement une copie au lieu de l'original.

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

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

Méthode Player.addCardToHand() n'est pas déraisonnable, si vous avez aucune raison de l'exposer une main. Ceci 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.

1

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

1

Renvoyer une référence à l'objet manuel, par ex.

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

Maintenant, votre fonction addCard() fonctionne sur l'objet correct.

0

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

Donc je suggérerais , au lieu de simplement utiliser une référence comme valeur de retour, pour modifier réellement la conception du code un peu. Quelques alternatives:

  • Expose une méthode getMutableHand qui renvoie un pointeur (ou référence). En retournant un pointeur, vous suggérez fortement que l'appelant utilise la notation de pointeur, de sorte que quiconque lit le code voit que cette variable change de valeurs et n'est pas en lecture seule.
  • Marque Joueur une sous-classe de Hand, de sorte que tout ce qui manipule une Main fonctionne aussi directement sur le Lecteur. Intuitivement, vous pourriez dire qu'un joueur n'est pas une main, mais fonctionnellement ils ont la bonne relation - chaque joueur a exactement une main, et il semble que vous voulez pouvoir avoir le même accès à une main via un joueur que vous serait directement.
  • Implémentez directement une méthode addCard pour votre classe Player.