通过另一个C++函数更改函数变量

Changing a functions variable through another C++ function

本文关键字:函数 变量 C++ 另一个      更新时间:2023-10-16

我刚开始乱搞C++但我被卡住了。任何帮助将不胜感激。

我想通过传入另一个函数将 gameState 的值从true更改为false,但是,我的思维过程似乎不正确:

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
void changeState(bool gameState){
string answer;
cout << "End game? Y/N" << endl;
cin >> answer;
if(answer == "Y"){
gameState = false;
} else if (answer == "N"){
gameState = true;
}    
}
void gameLoop(){
bool gameState = true;
while(gameState == true){
cout << "Game is being played" << endl;
changeState(gameState);
}    
}
int main(){    
gameLoop();  
return 0;
}

默认情况下,函数参数"按值"传递给 c/c++ 函数。这意味着该函数具有自己的游戏状态变量的本地副本,该副本初始化为调用方给出的值。

您有两种可能性:更改函数以引用变量或改为获取指向变量的指针。

采用引用的函数如下所示:

void ChangeState (bool &gameState){
gameState=false;
}

使用指针将如下所示:

void ChangeState (bool *gameState){
*gameState=false;
}

....ChangeState (&gameState);

使用引用可以被视为更方便,因为语法和局部变量的使用不会改变。另一方面,使用指针强制调用者使用 & 获取变量的地址,因此查看函数调用的每个人都知道该值可能会在函数内部更改。

在 c++ 中,当您将参数传递给函数时,通常会传递该值的副本,这意味着它只是该变量包含的内容的副本,而不是该变量。 为了创建输出参数,一个简单的解决方案是通过引用或指针传递。

我将展示参考版本:

void changeState(bool& gameState){
string answer;
cout << "End game? Y/N" << endl;
cin >> answer;
if(answer == "Y"){
gameState = false;
} else if (answer == "N"){
gameState = true;
}
}

代码完全相同,唯一的区别是参数列表中布尔值之后的 &。

本教程将更详细地介绍: http://www.cplusplus.com/doc/tutorial/functions/

此外,仅供参考,一个引用或指针,具体取决于操作系统,可以是 4 个字节,其中您的布尔值通常是 1 个字节,仅返回布尔值将比通过引用传递占用更少的内存。

返回按值传递的gameState变量,无需在代码中通过引用或指针传递,这可能会导致隐藏行为,

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
bool changeState(bool gameState){
string answer;
cout << "End game? Y/N" << endl;
cin >> answer;
if(answer == "Y"){
gameState = false;
} else if (answer == "N"){
gameState = true;
}  
return gameState; 
}
void gameLoop(){
bool gameState = true;
while(gameState == true){
cout << "Game is being played" << endl;
gameState = changeState(gameState);
}    
}
int main(){    
gameLoop();  
return 0;
}