¿Cómo utilizar el método de un objeto para actualizar el atributo de otro objeto?

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Tengo tres clases (C++):Jugador, Mano y Carta.

El jugador tiene un miembro, una mano, que tiene una mano.También tiene un método, getHand(), que devuelve el contenido de la mano.

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

Hand tiene un método, addCard(Card c), que agrega una carta a la mano.

Quiero hacer esto:

jugador1.getHand().addCard(c);

pero no funciona.No arroja un error, por lo que está haciendo algo.Pero si luego examino el contenido de la mano del jugador 1, la carta no se ha agregado.

¿Cómo puedo hacer que esto funcione?

¿Fue útil?

Solución

Si getHand() no devuelve una referencia, tendrá problemas.

Otros consejos

Si getHand() devuelve por valor, estás modificando una copia de la mano y no el original.

Un método Player.addCardToHand() no es irrazonable, si no tienes ningún motivo para exponer una mano.Probablemente esto sea ideal en algunos aspectos, ya que aún puedes proporcionar copias de la mano para realizar comparaciones de verificación de victorias y nadie puede modificarlas.

Su método necesita devolver un puntero o una referencia al objeto Mano del jugador.Luego podrías llamarlo como "player1.getHand()->addCard(c)".Tenga en cuenta que esa es la sintaxis que usaría si fuera un puntero.

Devuelve una referencia al objeto de mano, por ejemplo.

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

Ahora su función addCard() está operando en el objeto correcto.

¿Cuál es la declaración de getHand()?¿Está devolviendo un nuevo valor de Mano o está devolviendo una referencia de Mano&?

Como se ha dicho, probablemente esté modificando una copia en lugar del original.

Para evitar este tipo de error, puede declarar explícitamente los constructores de copia y los operadores iguales como privados.

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

getX() suele ser el nombre de una función de acceso para el miembro x, similar a su propio uso.Sin embargo, un descriptor de acceso "getX" también suele ser una función de solo lectura, por lo que puede resultar sorprendente en otras situaciones de su código base ver una llamada a "getX" que modifica X.

Por lo tanto, sugeriría, en lugar de simplemente usar una referencia como valor de retorno, modificar un poco el diseño del código.Algunas alternativas:

  • exponer un obtenerMutableMano Método que devuelve un puntero (o referencia).Al devolver un puntero, sugiere encarecidamente que la persona que llama utilice la notación de puntero, de modo que cualquiera que lea el código vea que esta variable está cambiando de valores y no es de solo lectura.
  • Hacer Jugador una subclase de Mano, de modo que cualquier cosa que manipule una Mano también funcione directamente en el Jugador.Intuitivamente, se podría decir que un jugador no es una mano, pero funcionalmente tienen la relación correcta: cada jugador tiene exactamente una mano, y parece que quieres poder tener el mismo acceso a una mano a través del jugador que tú. lo haría directamente.
  • Implementar directamente un agregar tarjeta método para su clase Player.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top