我有三个(C++)类:播放机、一方面,以及卡。

播放器有一个成员,一方面,拥有一手。它也有一个方法,getHand(),返回的内容。

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

一方面有一个方法,addCard(卡c),即增加了卡片到手。

我想要做这样的:

player1.getHand().addCard(c);

但是它不工作。它不会引发错误,因此它在做什么。但是,如果我内容检查player1的手之后,卡没有加入。

我怎么能得到这工作吗?

有帮助吗?

解决方案

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

其他提示

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

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

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

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

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

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

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

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

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

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

getX()通常的名称访问的功能部件x,类似于自己的使用情况。然而,一个"getX"访问也是很常常只读功能,以便它可以令人惊讶的在其他情况下的基本代码看到一个叫"getX"修改X.

所以我建议,而不是仅仅使用一个参照作为一个返回值,实际上修改编码的设计一点。一些备选方案:

  • 让一个 getMutableHand 方法指针返回(或基准)。通过返回的指针,你强烈建议,呼叫者使用的指标记法,以便任何人阅读的代码看见这个变量的变化值,而不是只读的。
  • 播放的一个子类手, ,因此,任何操纵手还直接在播放机。凭直觉,你可以说一个球员并不是一个方面,但在功能上,他们有权关系-每个球员都有一个方面,而且似乎你的想做到能够同样获得一方面通过播放机的因为你会直接。
  • 直接执行一个 addCard 方法为您播放器类。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top