2013-10-25 5 views
0

저는 C++을 완전히 처음 접했고 프로그래밍에 대한 유일한 경험은 자바입니다. 나는 여전히 포인터에 대한 핸들을 얻으려고하고있다. 두 번째 포인터가 가리키는 동일한 객체를 가리키는 포인터를 어떻게 할당합니까? 특히 currentPlayerplayer0 또는 player1을 지정하고 게임 상태가 변경되면 앞뒤로 전환하려고합니다. play() 기능 올바른에서 currentPlayer에 할당첫 번째 포인터가 가리키는 객체에 두 번째 포인터 할당

using namespace std ; 

struct Player { 
public: 
    string name ; 
    //fields 
}; 

class Game { 
private: 
    Player *player0 ; 
    Player *player1 ; 
    Player *currentPlayer ; 
    bool player0First ; 
    stringstream *gameLog ; 
    //more fields 

public: 
    void play() ; 
    void changeGmState(Player*) ; 
    //other member functions, etc. 
} ; 

void Game::play() { 
    if (player0First) 
     currentPlayer = *player0 ; 
    else 
     currentPlayer = *player1 ; 
    *gameLog << "It's " << currentPlayer->name << "'s turn!" << endl ; 
    changeGmState(currentPlayer) ; 
    //code 
} 

인가? Xcode는 생각하지 않는 것 같지만 포인터 할당과 비 참조 연산자의 적절한 사용에 의해 난 아직도 혼란 스럽다. 관련 질문 :이 코드는 올바른 플레이어 이름을 gameLog에 삽입합니까? currentPlayerchangeGmState()으로 전달하면 player0 또는 player1과 똑같이 작동합니까? 다른 의견을 보내 주시면 감사하겠습니다. 귀하의 도움에 미리 감사드립니다.

답변

3

play() 함수의 currentPlayer에 대한 할당이 정확합니까?

아니요. *는 몇 가지 의미가 있으므로 C++ 포인터 구문은 다소 혼란 스럽습니다.Player *currentPlayer ;이라는 표현식은 Player 객체에 대한 포인터를 만드는 것을 의미합니다 (즉, currentPlayer는 Player가있는 메모리 주소를 저장하는 변수입니다.) *currentPlayer이라고 말하면 Player 객체가 메모리 주소 (이것을 참조 역 참조라고 함). currentPlayer = *player0 ;은 실제로 의미가 없으며 메모리 주소 (currentPlayer 포인터) 만 저장하는 객체에 Player 객체 (*player0)를 저장한다고 말합니다. 언급 된 것은 기본적으로 의미

currentPlayer=player0; 

을 말을하는 것입니다 "그 player0가 가리키는 것과 같은 것으로 현재 플레이어의 메모리 주소를 설정합니다."당신은 또한 티는 같은 그것의 NK는 "동일한 일에 player0 점을 currentPlayer 점을 확인하십시오."다른 질문에 관련하여

,

는 "이 코드는 gameLog에 올바른 플레이어의 이름을 삽입합니다?"

예. *gameLog은 정확히 gameLog 포인터를 역 참조합니다.

changeGmState에 currentPlayer를 전달하면 player0 또는 player1에 전달하는 것과 똑같이 작동합니까? currentPlayerplayer0 또는 player1로 설정되어 있다고 가정

.

+0

감사! 그래서 C++ 포인터를 좀 더 잘 이해할 수있었습니다. – AdamJames

3

할당은 다음과 같아야합니다

if (player0First) 
    currentPlayer = player0 ; 
else 
    currentPlayer = player1 ; 

포인터는 메모리에있는 장소에 주소를 채 단지 다양하다. 포인터 변수 만 사용하면 데이터의 주소가됩니다.

*player0 

이 기능을 사용하면 메모리의 주소에 저장된 데이터에 액세스하고 있습니다.

이 할당 후 currentPlayer 변수에는 player0 (또는 player1)과 동일한 주소가 포함되고 *currentPlayer을 사용하면 동일한 주소로 동일한 데이터에 액세스하게됩니다.

참고 :

currentPlayer->name 

(*currentPlayer).name 
+0

감사합니다. 나는 그 사실을 알고 싶었습니다. – AdamJames

3

당신은 여기 RHS에 포인터를 역 참조에 대해 사용이 단지 바로 가기 :

currentPlayer = *player0 ; 
//   ^dereference, gives object pointed at by player0 

당신은 포인터를 지정해야합니다, 즉, LHS의 포인터를 RHS의 포인터와 같은 점을 가리 키도록합니다 :

0 조심 여기
currentPlayer = player0 ; 
2
if (player0First) 
    currentPlayer = *player0 ; 
else 
    currentPlayer = *player1 ; 

- 당신은 이러한 Player*의 양을 할당하고 Player

는 역 참조를 제거하기 :

if (player0First) 
    currentPlayer = player0 ; 
else 
    currentPlayer = player1 ; 
2

당신은

currentPlayer = player0 ; //currentPlayer now contains the address contained by Player0 

currentPlayer = player1 ; //currentPlayer now contains the address contained by Player1 
을 사용할 수 있습니다
관련 문제