2016-12-05 1 views
0

방금 ​​C++로 어지럽게 시작했지만 막혔습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 다른 C++ 함수를 통해 함수 변수 변경

나는 그러나, 다른 함수에 전달하여 falsetrue에서 gameState의 값을 변경하려면

, 내 생각 과정은 잘못된 것 같다 :

당신이 함수에 인수를 전달할 때 C++로
#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; 
} 
+4

패스 할 수있다. – sharyex

+0

[참조로 전달할 때와 값으로 전달하는 경우의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing- by value) – user4581301

+0

또는 gameState를 전역 변수로 만들 수 있습니다 (예 : "bool gameState = true;"행을 이동하여 "changeState void (bool gameState) {"행 위에 나타남) –

답변

1

그 일반적으로 해당 값의 복사본이 전달됩니다. 즉 해당 변수가 포함하는 것의 복사본 일 뿐이며 변수가 아닙니다. 출력 매개 변수를 생성하려면 간단한 해결책이 참조 또는 포인터를 전달하는 것입니다.

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; 
    } 
} 

코드는 동일한 유일한 차이점은 매개 변수 목록 내에서 부울 후 &입니다 :

나는 레퍼런스 버전을 표시합니다. A는 참고로, OS에 따라 참조 또는 포인터가, 당신의 부울는 일반적으로 1 바이트 4 바이트, 단지 부울 값을 반환 할 수있는 단지 또한 http://www.cplusplus.com/doc/tutorial/functions/

:

이 튜토리얼은 자세히로 이동합니다 참조로 전달되는 메모리가 적습니다.

+0

명확하고 간결한 답변에 감사드립니다! –

2

기본적으로 함수 매개 변수는 "값으로"c/C++ 함수에 전달됩니다. 즉, 함수에는 호출자가 제공 한 값으로 초기화되는 gamestate 변수의 로컬 복사본이 있습니다.

두 가지 가능성이 있습니다 : 변수를 참조하거나 포인터를 변수로 가져 오도록 함수를 변경하십시오.

과 같을 것이다 참조를 복용하는 기능 :

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

.... ChangeState (&gameState);

수에 대한 참조를 사용하여 다음과 같을 것이다

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

포인터를 사용하여 구문과 로컬 변수의 사용이 변경되지 않아서보다 편리하게 볼 수 있습니다. 반면에 포인터를 사용하면 호출자가 변수의 주소를 가져 오는 데 &을 사용하게되므로 함수 호출을보고있는 모든 사람은 값이 함수 내부에서 변경 될 수 있음을 알게됩니다.

1

반환 값에 의해 전달 된 gameState varible, 당신의 코드에서 참조 또는 포인터를 통과 할 필요가 없습니다, 이것은 동작을 숨길지도 참조 또는 포인터로

#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; 
} 
관련 문제