2012-03-26 5 views
1

Я по-прежнему относительно новичок в C++ и программировании, но хорошо разбираюсь. Я пишу небольшую, очень простую программу ncurses, которая до сих пор должна просто перемещать «#» по экрану с помощью клавиш WASD.Невозможно изменить переменную класса из новой функции

Проблема в том, что я не могу изменить player.x в первой функции Update().

Вот код:

#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 (Player player) `, а затем, когда вы вызываете функцию обновления, переходите в экземпляр

+0

Это потрясающе, спасибо всем, кто дал это решение! Я получил его работу, и теперь гораздо лучше понимаю классы! – maximida

1

Нет player, указанный в Update(). Чтобы эта работа работала, вам нужно иметь доступ к переменной player, объявленной в main. Для этого вам нужно передать переменную указателем или ссылкой на Update.

В основной:

Update(player); 

Изменение подписи обновления для:

void Update(Player& player); 

Это передает объект с именем player типа Player в Update по ссылке.

0

Как функция Update должна знать, какой объект она должна изменить? Вы создаете Player по имени player, но тогда вы не дадите это функции Update.

Смежные вопросы