我发现了一个类似于这个问题的问题,虽然提出的方式比我认为的要复杂得多(问题得分为-2)。希望这会更容易理解。
事情的一般要点是涉及的两个类是GUI和Player(我在其他类的其他地方遇到了同样的问题,但是如果我能理解为什么这个不起作用,它应该适用于其余的)
GUI包含“Player.h”。 Player类有一个公共布尔变量'hasBall';当'Player'传递给函数Pass()并且布尔值改变时,它似乎只是一个临时对象,因此不会更新自己传递的对象。请参阅以下代码:
这很好,Plyr1A和Plyr2A(在Gui.h中定义)的布尔值被更改和保留
Plyr1A.hasBall = false;
Plyr2A.hasBall = true;
然而,Plyr1A和Plyr2A的布尔值与此保持一致。
Pass(Plyr1A,Plyr2A); //Boolean values for Plyr1A and Plyr2A remain the same with this.
void GUI::Pass(Player passer, Player receiver) {
passer.hasBall = false;
receiver.hasBall = true;
}
如果有人能向我解释为什么会这样,我会非常感激!如果需要任何额外信息,请告诉我。
干杯:)
答案 0 :(得分:4)
您的函数复制了参数(它们是按值传递),然后更改副本,而不是“原始”对象(在函数体中)。
您应该将其更改为使用指针或引用,例如:
//-------------------v---------------v <---these are references
void GUI::Pass(Player& passer, Player& receiver) {
当然,您也应该更改声明。
答案 1 :(得分:1)
使用引用传递对象。
答案 2 :(得分:0)
考虑这个功能:
void someFunction (int j)
{
j = 8;
}
并说我们称之为:
someFunction (3);
您是否认为someFunction
中的作业会以某种方式使3
成为8
?你的期望毫无意义。如果没有某种特殊的安排,那么函数内的赋值就不能改变调用者的值。