Невозможно изменить переменную класса из новой функции - PullRequest
1 голос
/ 26 марта 2012

Я все еще относительно новичок в 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;
}

Любой вклад будет полезен!

Ответы [ 3 ]

4 голосов
/ 26 марта 2012

Все переменные в c ++ связаны с областью видимости. Думайте о области видимости этой переменной. В этом случае игрок виден только с той функцией, в которой он объявлен, и является главной. Чтобы обновить игрока, вы должны либо увеличить его масштаб и сделать его глобальным (плохая идея), либо b. передать это в вашу функцию.

Если вы сменили Update на ссылку игрока, вы можете выполнить то, что пытались. Новое объявление будет выглядеть так: «void Update (Player & player)», тогда, когда вы вызываете функцию обновления, передайте в экземпляр

2 голосов
/ 26 марта 2012

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

В основном:

Update(player);

Изменить подпись Обновления на:

void Update(Player& player);

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

0 голосов
/ 26 марта 2012

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

...