Pergunta

Eu tenho três (C ++) classes:. Jogador, mão e cartão

O jogador tem um membro, mão, que mantém uma mão. Ele também tem um método, getHand (), que retorna o conteúdo de mão.

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

Mão tem um método, addCard (cartão c), que adiciona um cartão ao lado.

Eu quero fazer isso:

player1.getHand () addCard (c);.

mas ele não funciona. Ele não lançar um erro, por isso está fazendo algo. Mas se eu examinar o conteúdo da mão de player1 depois, não foi adicionado o cartão.

Como posso chegar a este trabalho?

Foi útil?

Solução

Se getHand () não está retornando uma referência, você estará em apuros.

Outras dicas

Se getHand () retorna a-valor que você está modificando uma cópia da mão e não o original.

A Player.addCardToHand () método não é razoável, se você não tem nenhuma razão para expor de outra forma uma mão. Este é provavelmente ideal em alguns aspectos, como você ainda pode fornecer cópias da mão para comparações de verificação de ganhar, e ninguém pode modificá-los.

Seu método precisa retornar um ponteiro ou um refernce ao objeto mão do jogador. Você poderia, então chamá-lo assim "player1.getHand () -> addCard (c)". Note-se que esta é a sintaxe que você usaria se fosse um ponteiro.

retornar uma referência para o objeto de mão, por exemplo.

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

Agora, sua função addCard () está a funcionar com o objeto correto.

O que é a declaração de getHand ()? É retornando um novo valor mão, ou ele está retornando um Hand & referência?

Como já foi dito, provavelmente você está modificando uma cópia em vez do original.

Para evitar esse tipo de erro, você pode declarar explicitamente construtores de cópia e é igual a operadores como privado.

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

getX () é muitas vezes o nome de uma função de assessor de membro x, semelhante ao seu próprio uso. No entanto, um acessor "getX" é também muitas vezes uma função de somente leitura, de modo que pode ser surpreendente em outras situações de sua base de código para ver uma chamada para "getX" que modifica X.

Assim, gostaria de sugerir, em vez de apenas usando uma referência como um valor de retorno, para realmente modificar o código projetar um pouco. Algumas alternativas:

  • Expor um getMutableHand método que retorna um ponteiro (ou referência). Ao devolver um ponteiro, você sugerem fortemente que o chamador usa a notação de ponteiro, de modo que qualquer um que lê o código vê que esta variável é alterar os valores, e não é só de leitura.
  • Faça Jogador uma subclasse de mão , de modo que qualquer coisa que manipula uma mão também funciona diretamente no Player. Intuitivamente, pode-se dizer que um jogador não é uma mão, mas funcionalmente eles têm o direito relacionamento - Cada jogador tem exatamente um lado, e parece que você quer ser capaz de ter o mesmo acesso a uma mão através jogador como você faria diretamente.
  • Diretamente implementar um addCard método para a classe Player.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top