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

时间:2008-09-22 03:26:28

标签: c++ oop methods

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

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

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

Hand有一个方法,addCard(卡片c),可以在手上添加一张卡片。

我想这样做:

player1.getHand()addCard(C);

但它不起作用。它不会抛出错误,所以它正在做一些事情。但是如果我之后检查了player1的手的内容,那么该卡还没有添加。

我怎样才能让它发挥作用?

8 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果getHand()没有返回引用,那么你将遇到麻烦。

答案 2 :(得分:1)

如果您没有理由以其他方式暴露一只手,则Player.addCardToHand()方法并非不合理。这在某些方面可能是理想的,因为您仍然可以提供Hand的副本以进行获胜检查比较,并且没有人可以修改它们。

答案 3 :(得分:1)

您的方法需要返回指针或引用播放器的Hand对象。然后,您可以将其称为“player1.getHand() - > addCard(c)”。请注意,这是您使用它的语法,它是一个指针。

答案 4 :(得分:1)

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

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

现在你的addCard()函数正在对正确的对象进行操作。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

为了防止出现这种错误,您可以将copy constructors和equals运算符显式声明为private。

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

答案 7 :(得分:0)

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

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

  • 公开一个返回指针(或引用)的 getMutableHand 方法。通过返回指针,强烈建议调用者使用指针表示法,以便读取代码的任何人看到此变量正在更改值,并且不是只读的。
  • 使播放器成为Hand的子类,以便操作Hand的任何内容也可以直接在播放器上运行。直觉上,你可以说一个玩家不是一个玩家,但在功能上他们有正确的关系 - 每个玩家只有一只手,而你似乎希望能够通过玩家获得与玩家同样的权限。会直接。
  • 直接为您的Player类实现 addCard 方法。