如何使用一个对象的方法来更新另一个对象的属性?

时间:2020-03-06 14:31:22  来源:igfitidea点击:

我有三个(C ++)类:Player,Hand和Card。

玩家有一个手,该手握有一个手。它还具有getHand()方法,该方法返回hand的内容。

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

牌有一个方法addCard(Card c),它将牌添加到牌上。

我想做这个:

player1.getHand()。addCard(c);

但这是行不通的。它不会引发错误,因此正在执行某些操作。但是如果以后再检查玩家1的手的内容,则表示该卡尚未添加。

我怎样才能使它正常工作?

解决方案

如果getHand()返回按值,则表示我们正在修改手的副本,而不是原始副本。

getHand()的声明是什么?是返回新的Hand值,还是返回Hand&参考?

如果getHand()没有返回引用,我们将遇到麻烦。

如前所述,我们可能正在修改副本而不是原始副本。

为避免这种错误,我们可以显式声明复制构造函数并将等于运算符作为私有。

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

如果我们没有理由公开一手牌,则Player.addCardToHand()方法并非没有道理。在某些方面,这可能是理想的选择,因为我们仍然可以提供Hand的副本以进行胜利检查比较,而且没有人可以对其进行修改。

方法需要返回指向播放器的Hand对象的指针或者引用。然后,我们可以将其命名为" player1.getHand()-> addCard(c)"。请注意,这就是我们将其用作指针的语法。

返回对手对象的引用,例如。

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

现在,addCard()函数正在正确的对象上运行。

getX()通常是成员x的访问器函数的名称,类似于我们自己的用法。但是," getX"访问器通常也是只读功能,因此在代码库的其他情况下,看到对修改X的" getX"的调用可能会令人惊讶。

因此,我建议,不要仅仅使用引用作为返回值,而是要实际修改代码设计。一些替代方案:

  • 公开一个getMutableHand方法,该方法返回一个指针(或者引用)。通过返回指针,强烈建议调用者使用指针符号,以便任何阅读代码的人都可以看到此变量正在更改值,并且不是只读的。
  • 将Player设为Hand的子类,以便任何操作Hand的东西也可以直接在Player上使用。直观地讲,我们可以说一个牌手不是一手牌,但从功能上讲,它们之间是正确的关系-每个牌手都只有一手牌,而且看起来我们确实希望能够通过与该牌手相同的方式来通过牌手会直接。
  • 直接为Player类实现addCard方法。