在函数c ++中更改时未保留类的公共变量

Posted

技术标签:

【中文标题】在函数c ++中更改时未保留类的公共变量【英文标题】:Public variables of class not being preserved when altered in function c++ 【发布时间】:2014-03-10 10:45:06 【问题描述】:

我发现了一个与这个问题类似的问题,尽管其提出的方式比我认为我需要的更复杂(问题得分为 -2)。希望这会更容易理解。

事情的一般要点是所涉及的两个类是 GUI 和 Player(我在其他类的其他地方也遇到过同样的问题,但如果我能理解为什么这个不起作用,它应该适用于其余类) .

GUI 包括“Player.h”。 Player 类有一个公共布尔变量“hasBall”;当“播放器”被传递到函数 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;

如果有人能向我解释为什么会发生这种情况,我将不胜感激!如果需要任何额外的信息,请告诉我。

干杯:)

【问题讨论】:

【参考方案1】:

您的函数会复制参数(它们按值传递),然后更改副本,而不是“原始”对象(在函数体中)。

你应该改变它以获取指针或引用,例如:

//-------------------v---------------v   <---these are references
void GUI::Pass(Player& passer, Player& receiver) 

当然,您也应该更改声明。

【讨论】:

太棒了,谢谢 :) 我意识到这是一个愚蠢的问题(基于反馈),所以我很欣赏一个可靠的答案。有时在互联网上很难找到,隐藏在更复杂的示例中。【参考方案2】:

使用引用传递您的对象。

【讨论】:

【参考方案3】:

考虑这个函数:

void someFunction (int j)

    j = 8;

假设我们这样称呼它:

someFunction (3);

您是否认为someFunction 中的分配以某种方式使3 成为8?你的期望毫无意义。如果没有某种特殊的安排,函数内部的赋值不可能改变调用者的值。

【讨论】:

"你是否认为 someFunction 中的赋值使 3 变成了 8?"我以前的错误理解会导致我得到肯定的答案。我会假设它相当于: int j = 3; j = 8;唉,我已经看到了我的方式的错误

以上是关于在函数c ++中更改时未保留类的公共变量的主要内容,如果未能解决你的问题,请参考以下文章

C#:为啥我必须在类的变量中使用公共访问修饰符?

如何更改指针变量的值并将更改保留在函数之外而无需通过引用传递?

C++ 类 - 使用公共变量并在类外定义成员函数

在私有继承中公开构造函数

让公共成员变量访问 C++ 中同一类的私有成员

在 C++ 中的类的函数内部声明变量