2011-04-08 69 views
0

我用C++編程,並有一個使用靜態變量的方法。該方法並不如我認爲的那樣工作;經過調查,我發現我的靜態變量在兩個地方以紅色突出顯示,而在其他地方顯示爲藍色。下面是代碼:Visual Studio編譯器突出顯示靜態變量的不同?

int GameModeState::changeJob(int number) 
{ 
    static int job = 1; //red 
    if (number == 1) 
    { 
     job = (job+1); //First one is red, second one is blue 
     return job; //blue 
    } else { 
     return job; //blue 
    } 
} 

我調用此方法與其它方法,一個示例所示:

int GameModeState::getJob() 
{ 
    int currentJob = (changeJob(2)); 
    return currentJob; 
} 

我要像getJob()的方法簡單地返回job電流值,而當調用changeJob(number)時,另一種方法是changeJob(1),將作業值增加1。 (因此,changeJob(number)中的if/else語句)。 由於job變量以不同的方式突出顯示,我在想編譯器在說它以某種方式分別查看這兩個變量?我陷入了job甚至有些價值。

編輯我也有Awesomium ...我相信這是編譯器的唯一補充,但我不完全確定。

MOAR編輯在另一類,我應該確定當前工作的數量和做基礎的東西,如果數量爲偶數或奇數(因爲現在只有兩個作業)

void ZoneMovementState::_changeZone(const String& message, const Awesomium::JSValue& input, Awesomium::JSValue& output) 
{ 
    //Awesomium::JSValue::Object object = input.getObject(); 
    //String zoneFilename = Convert::toString(object[L"zoneFilename"].toString()); 

    // If the number from getJob is even, the player is currently a geologist 
    if (GameModeState::getJob()%2 == 0) 
    { 
     ZoneParser::getSingleton().load("../media/zones/geology_zone.xml", false); 
    } else { 
     ZoneParser::getSingleton().load("../media/zones/farm_zone.xml", false); 
    } 
    transitionHandler->go(); 
} 
的方法

忽略兩條註釋掉的行;他們處理的JS,我現在不工作。 在節目中,我可以訪問farm_zone直到我GameModeState增加使用下面的方法工作的價值:

void GameModeState::_openNotebook(const String& message, const Awesomium::JSValue& input, Awesomium::JSValue& output) 
{ 
    mNotebookTransition->go(); 
    static int currentJob = changeJob(1); 
} 

....所以我想通了,我的問題。在通過代碼向大家展示時,我意識到currentJob的靜態可能不需要了......一旦我將其刪除,我的代碼就會像現在這樣運行。

感謝您的幫助!

+0

你爲什麼使用本地靜態變量而不是類成員變量? – Erik 2011-04-08 14:48:43

+0

因爲我不知道什麼成員變量是?我是一名新手C++程序員。 – Briz 2011-04-08 14:50:44

+0

Visual Studio不應該突出顯示其中任何一個。你已經安裝了什麼pulgin? – JaredPar 2011-04-08 14:51:57

回答

1

這裏的問題的一部分是你正在使用靜態本地的東西很可能應該只是一個成員變量。靜態本地維護它在進程中所有線程中對函數的所有調用中的值。更有可能的是,你希望它在特定的GameModeState實例中保持對changeJob的所有調用(否則爲什麼要將它作爲開始的成員函數?)。

要做到這一點,你需要定義一個成員變量GameModeState在構造函數中初始化它,然後在方法中訪問它。例如

class GameModeState { 
    int job; 
    GameModeState() : job(1) {} 
    int changeJob(int number); 
}; 

int GameModeState::changeJob(int number) { 
    if (number == 1) { 
     job = (job+1); 
     return job; 
    } else { 
     return job; 
    } 
} 

注:我不完全確定爲什麼你看到了你看到的顏色。 Visual Studio在默認情況下不會將成員變量着色爲C++中的特定顏色,所以它很可能是您正在使用的另一個加載項。

+0

VS中沒有這樣的編輯模式加載項。 – 2011-04-08 14:57:46

+0

嗯,我想從另一個班級獲得工作的價值。我不確定GameModeState是否是「單一實例」,或者每次激活時都會重新創建(與3D遊戲公司合作;在我到達此處之前構建的非常複雜的類)。這就是爲什麼我試圖使用靜態變量,因爲它看起來幾乎像全局變量 – Briz 2011-04-08 15:00:35

+0

@Pete Resharper,DevExpress,Visual assist等... – JaredPar 2011-04-08 15:02:25

0

那麼,突出顯示並不意味着什麼。也就是說,編輯器在決定如何/何時/何時突出顯示之前不會調用編譯器。所以這不是你的問題。對不起'回合:-)

你可以通過轉到工具 - >選項 - >文本編輯器來證明這一點,並注意到你可以通過選擇不同的文本編輯模型來改變突出顯示。

相關問題