Come utilizzare il metodo di un oggetto per aggiornare l'attributo di un altro oggetto?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Ho tre classi (C ++): Player, Hand e Card.

Il giocatore ha un membro, mano, che tiene una mano. Ha anche un metodo, getHand (), che restituisce il contenuto della mano.

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

La mano ha un metodo, addCard (Card c), che aggiunge una carta alla mano.

Voglio fare questo:

player1.getHand () AggiungeCarta (c);.

ma non funziona. Non genera un errore, quindi sta facendo qualcosa. Ma se esamino successivamente il contenuto della mano di player1, la carta non è stata aggiunta.

Come posso farlo funzionare?

È stato utile?

Soluzione

Se getHand () non restituisce un riferimento, ci si troverà nei guai.

Altri suggerimenti

Se getHand () restituisce per valore, stai modificando una copia della mano e non l'originale.

Un metodo Player.addCardToHand () non è irragionevole, se non hai motivo di esporre altrimenti una mano. Questo è probabilmente l'ideale in qualche modo, dato che puoi ancora fornire copie della Mano per i confronti delle vittorie e nessuno può modificarli.

Il tuo metodo deve restituire un puntatore o un riferimento all'oggetto Mano del giocatore. Potresti quindi chiamarlo come " player1.getHand () - > addCard (c) " ;. Nota che questa è la sintassi che avresti usato fosse un puntatore.

Restituisce un riferimento all'oggetto mano, ad es.

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

Ora la tua funzione addCard () è operativa sull'oggetto corretto.

Qual è la dichiarazione di getHand ()? Restituisce un nuovo valore di Hand o restituisce un Hand & amp; di riferimento?

Come è stato affermato, probabilmente stai modificando una copia anziché l'originale.

Per prevenire questo tipo di errore, è possibile dichiarare esplicitamente i costruttori di copie ed è uguale agli operatori come privati.

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

getX () è spesso il nome di una funzione di accesso per il membro x, simile al proprio utilizzo. Tuttavia, un "getX" l'accessor è anche molto spesso una funzione di sola lettura, quindi potrebbe essere sorprendente in altre situazioni della tua base di codice vedere una chiamata a " getX " che modifica X.

Quindi suggerirei, invece di usare semplicemente un riferimento come valore di ritorno, di modificare un po 'il design del codice. Alcune alternative:

  • Esporre un metodo getMutableHand che restituisce un puntatore (o riferimento). Restituendo un puntatore, si consiglia vivamente che il chiamante utilizzi la notazione del puntatore, in modo che chiunque legga il codice veda che questa variabile sta cambiando valori e non è di sola lettura.
  • Rendi Giocatore una sottoclasse di Mani , in modo che tutto ciò che manipola una Mano funzioni anche direttamente sul Giocatore. Intuitivamente, potresti dire che un giocatore non è una mano, ma funzionalmente hanno la giusta relazione: ogni giocatore ha esattamente una mano e sembra che tu voglia poter avere lo stesso accesso a una mano tramite il giocatore come te direttamente.
  • Implementa direttamente un metodo addCard per la tua classe Player.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top