我有三个(C ++)类:Player,Hand和Card。
玩家有一个握手的成员。它还有一个方法getHand(),它返回hand的内容。
Hand Player::getHand() {
return hand;
}
Hand有一个方法,addCard(卡片c),可以在手上添加一张卡片。
我想这样做:
player1.getHand()addCard(C);
但它不起作用。它不会抛出错误,所以它正在做一些事情。但是如果我之后检查了player1的手的内容,那么该卡还没有添加。
我怎样才能让它发挥作用?
答案 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”调用可能会令人惊讶。
所以我建议,而不是仅使用引用作为返回值,实际修改代码设计。一些替代方案: