2012-03-26 67 views
1

對於C++和編程,我還是比較新的,但學習時間很長。我正在編寫一個小型,非常簡單的ncurses程序,到目前爲止,只需使用WASD鍵在屏幕上移動一個「#」即可。無法修改新函數中的類變量

問題是我無法在第一個函數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'?它會給你一個編譯時錯誤嗎?它在運行時什麼都不做?你有沒有嘗試添加調試打印? – 2012-03-26 01:59:04

+0

您可能需要檢查屏幕邊框,以便您不會在屏幕外畫圖。 – hochl 2012-03-26 02:03:14

+0

抱歉喬納森我忘了指定編譯器抱怨player.x沒有在這個範圍內定義。也hochl我會這樣做後;-) – maximida 2012-03-26 02:17:25

回答

4

C++中的所有變量都與範圍相關聯。將範圍看作該變量的可見性。在這種情況下,播放器只有在聲明其中main的函數中才可見。要更新玩家,您必須增加其範圍並將其設爲全局(壞主意)或b。傳遞給你的功能。

如果您將Update更改爲玩家參考,則可以完成您嘗試的操作。新的聲明看起來像這個'無效更新(播放器&播放器)`然後當你在實例中調用你的更新函數通過

+0

這真棒,感謝所有誰給這個解決方案!我懂了,現在好多瞭解課堂! – maximida 2012-03-26 02:35:24

1

Update()中沒有聲明player。爲了使這項工作,您需要能夠訪問main中聲明的player變量。要做到這一點,你需要通過指針或參考Update傳遞變量。

在主:

Update(player); 

變化更新到簽名:

void Update(Player& player); 

此通過參考命名Player類型的playerUpdate的對象。

0

Update函數應該如何知道它應該修改哪個對象?你創建了一個叫做playerPlayer,但是你並沒有把它給Update函數。