2012-03-26 3 views
1

저는 아직 C++ 및 프로그래밍에 익숙하지 않지만 좋은 학습 시간을 갖고 있습니다. 지금까지 간단히 WASD 키를 사용하여 화면에서 "#"을 움직여야하는 작고 매우 간단한 ncurses 프로그램을 작성했습니다.새로운 함수 내에서 클래스 변수를 수정할 수 없습니다.

첫 번째 기능인 Update()에서 player.x를 변경할 수 없습니다.

#include <iostream> 
#include <ncurses.h> 

using namespace std; 

class Player 
{ 
    public: 

    int x; 
    int y; 
}; 

void Update() 
{ 
    int z; 

    z = getch(); 

    if(z == 97) //A key 
     { 
      player.x--; 
     } 

    if(z == 100) //D key 
     { 
      player.x++;   
     } 

    if(z == 119) //W key 
     { 
      player.y--; 
     } 

    if(z == 115) //S key 
     { 
      player.y++;   
     } 
} 


void Draw(int xPos, int yPos) 
{ 
    clear(); 

    mvprintw(yPos,xPos,"#"); 

    refresh(); 
} 

int main() 
{ 
    initscr(); 
    noecho(); 

    int doContinue; 

    Player player; 

    do 
    {   
     Update();  
     Draw(player.x, player.y); 

    }while((doContinue=getch()) != 27); 

    endwin(); 
    return 0; 
} 

모든 입력이 도움이 될 것입니다 : 여기

코드입니다!

+0

'player.x'를 "변경할 수 없음"이란 무엇을 의미합니까? 컴파일시 오류가 발생합니까? 그것은 런타임에 아무 일도하지 않습니까? 디버그 인쇄물을 추가 했습니까? –

+0

화면 테두리를 확인하여 화면 바깥으로 그려 내지 않도록 할 수 있습니다. – hochl

+0

죄송합니다. Jonathan이 범위에서 player.x가 정의되지 않았다는 불만을 표시하는 컴파일러를 지정하는 것을 잊어 버렸습니다. 또한 hochl 이후에 할거야 ;-) – maximida

답변

4

C++의 모든 변수는 범위와 연관되어 있습니다. 범위를 해당 변수의 가시성이라고 생각하십시오. 이 경우 플레이어는 메인으로 선언 된 함수에서만 볼 수 있습니다. 플레이어를 업데이트하려면 범위를 넓히고 글로벌하게 설정해야합니다 (나쁜 생각). 또는 b. 그것을 당신에게 전달하십시오.

Update을 변경하여 플레이어를 참조하게하면 시도한 것을 성취 할 수 있습니다. 새 선언은 인스턴스에서 업데이트 기능을 호출 할 때 'void Update (플레이어 & 플레이어)'라고 표시됩니다.

+0

이 솔루션을 주신 모든 분들께 감사드립니다. 나는 그것을 작동 시켰고 이제는 수업을 더 잘 이해합니다! – maximida

1

Update()에 선언 된 player이 없습니다. 이 기능을 사용하려면 main에 선언 된 player 변수에 액세스 할 수 있어야합니다. 이를 수행하려면 변수를 포인터 또는 참조로 Update에 전달해야합니다. 메인에서

:

Update(player); 

변경으로 업데이트의 서명 :

void Update(Player& player); 

이 참조에 의해 Update에 유형 Playerplayer라는 이름의 객체를 전달합니다.

0

Update 함수는 수정해야하는 개체를 어떻게 알 수 있습니까? (player)을 만들었지 만 Update 함수에는 제공하지 않습니다.

관련 문제