Wie ein Objekt Methode zu verwenden, anderen Objekts Attribut zu aktualisieren?

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

  •  02-07-2019
  •  | 
  •  

Frage

Ich habe drei (C ++) Klassen:. Spieler, Hand und Karte

Spieler hat ein Mitglied, Hand, die eine Hand hält. Es hat auch eine Methode, getHand (), die den Inhalt der Hand zurück.

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

Hand hat eine Methode, addCard (Karten-c), die eine Karte auf die Hand hinzufügt.

Ich möchte, dies zu tun:

player1.getHand () addCard (c);.

, aber es funktioniert nicht. Es gibt keinen Fehler werfen, so dass es etwas zu tun. Aber wenn ich den Inhalt player1 Hand danach zu untersuchen, wird die Karte nicht hinzugefügt.

Wie kann ich diese Arbeit bekommen?

War es hilfreich?

Lösung

Wenn getHand () nicht einen Verweis Rückkehr Sie in Schwierigkeiten sein wird.

Andere Tipps

Wenn getHand () gibt by-Wert, den Sie eine Kopie der Hand ist zu modifizieren und nicht das Original.

Ein Player.addCardToHand () -Methode ist nicht unvernünftig, wenn Sie keinen Grund, sonst eine Hand aus. Dies ist wahrscheinlich ideal in gewisser Weise, wie Sie noch Kopien der Hand für Win-Überprüfung Vergleiche zur Verfügung stellen können, und niemand kann sich ändern.

Ihre Methode muss einen Zeiger oder einen refernce auf die Hand des Spielers Objekt zurückzukehren. Man könnte es so nennen wie "player1.getHand () -> addCard (c)". Beachten Sie, dass das ist die Syntax Sie es verwenden, würde es ein Zeiger waren.

Gibt einen Verweis auf das Hand-Objekt zB.

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

Jetzt ist Ihre addCard () Funktion auf das richtige Objekt in Betrieb ist.

Was ist die Erklärung von getHand ()? Ist es eine neue Hand Wert zurückgibt, oder ist es eine Handreferenz Rückkehr?

Wie erwähnt, sind Sie wahrscheinlich eine Kopie anstelle des Originals zu ändern.

diese Art von Fehler zu vermeiden, können Sie explizit Kopierkonstruktoren erklären und gleich Betreiber als privat.

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

getX () ist oft der Name einer Zugriffsfunktion für Mitglied x, ähnlich wie Ihre eigene Nutzung. Allerdings ist ein „getX“ Accessor auch sehr oft eine Nur-Lese-Funktion, so dass es in anderen Situationen Ihrer Code-Basis überraschend sein kann, um einen Anruf zu sehen „getX“, die X modifiziert.

So würde ich vorschlagen, anstatt nur eine Referenz als Rückgabewert verwendet wird, um tatsächlich das Code-Design ein wenig zu ändern. Einige Alternativen:

  • Expose eine getMutableHand Methode, die einen Zeiger (oder Referenz) liefert. Durch einen Zeiger zurückkehrt, empfehlen dringend, dass der Anrufer die Zeigernotation verwendet, so dass jeder den Code zu lesen versteht, dass diese Variable Änderung der Werte ist, und ist nicht schreibgeschützt ist.
  • Erstellen Spieler eine Unterklasse von Hand , so dass alles, was auch eine Hand manipuliert direkt auf dem Player funktioniert. Intuitiv könnte man sagen, dass ein Spieler nicht eine Hand ist, aber funktionell haben sie die richtige Beziehung - jeder Spieler hat genau eine Hand, und es scheint, dass Sie den gleichen Zugang zu einer Hand über Spieler, wie Sie in der Lage sein wollen würde direkt an.
  • Direkt ein implementieren addCard Methode für Ihre Spieler-Klasse.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top