2010-12-17 95 views
1

比方說,我有一個頭文件Snake.h:命名空間的單一方法,C++

#include "SnakeBodyPart.h" 
#include "GUI.h" 
//... 

而且SnakeBodyPart.h是(除其他事項外):

#include "GUI.h" 
class SnakeBodyPart { 
    private : 
     GUI::Orientation orientation; 
} 

,最後GUI。 H:

class GUI { 
    enum Orientation { NORTH, EAST, SOUTH, WEST }; 
} 

現在Snake.cpp我要做到以下幾點:

void Snake::turn(){ 
    if(bodyPart.getOrientation() == GUI::EAST){ 
     //do something 
    else if (bodyPart.getOrientation() == GUI::SOUTH){ 
     //do something 
    else if ... 
} 

我想你明白了。我想知道的是:是否可以爲單個方法設置命名空間?像給名稱空間GUI到Snake::turn,所以我只能鍵入bodyPart.getOrientation() == EAST

我在與Snake.cpp不同的命名空間的幾個枚舉,並想使代碼更readible,通過給予一定的方法的某些命名空間,而不只是一個命名空間爲Snake.cpp。這可能嗎?

+0

爲什麼要包含「GUI.h」兩次,snake.h和SnakeBodyPart.h?必須是靜態函數,否則必須實例化對象以調用它們。爲什麼命名空間使用靜態函數。將所有枚舉收集在一個名稱空間中而不是類函數中。 – DumbCoder 2010-12-17 14:08:20

+0

你的回答對我來說絕對沒有意義。 – Aerus 2010-12-17 14:15:17

+1

另請注意,您可以切換(bodyPart.getOrientation())以避免else-if鏈。 – 2010-12-18 00:39:58

回答

3

請注意在你的例子中,GUI不是一個命名空間,而是一個類。

話雖這麼說,裏面turn()你可以寫using namespace GUI;訪問所有標識符在GUI命名空間沒有明確地進行限定。或者,您可以使用例如導入單個符號。 using GUI::EAST;,太:

void Snake::turn(){ 
    using namespace GUI; 
    if(bodyPart.getOrientation() == EAST){ 
     //do something 
    else if (bodyPart.getOrientation() == SOUTH){ 
     //do something 
    else if ... 
} 
+0

嗯,我一定會混淆一些東西..我認爲每個類都有它自己的命名空間?圖形用戶界面確實是一個類,所以我該怎麼做呢? (不要寫GUI :: EAST,而只寫東東) – Aerus 2010-12-17 14:12:51

+0

@Aerus:是的,從概念上講,類是所有包含成員的新名稱空間。但是,我在談論C++構造的'namespace'。如果你在C++命名空間中有你的枚舉,你可以使用我建議的'using'語句。考慮讓'GUI'成爲一個類(通常有一個類似於包含所有有趣的枚舉和常量的名稱空間)。 – 2010-12-17 14:25:15

+0

啊,我明白了。在你的最後一句話中,你的意思是:考慮讓'GUI'成爲一個*命名空間*?由於現在,它*是*一類。我會盡力做到這一點,但這是作業的一部分,我們不允許更改我們提供的頭文件,所以在完成我的項目後我會嘗試這個。 (該死的你內存泄漏使我無法完成它) – Aerus 2010-12-17 14:35:08

1

由於GUI是一類,僅僅是清晰和明確,並輸入了GUI::所以大家閱讀代碼知道發生了什麼的情況下。你必須用一些額外的輸入來編寫代碼一次,但是人們可能必須閱讀代碼多年。

編輯:或者如果GUI不需要是一個類(僅限enum S),將其更改爲一個命名空間,並在你的函數做using namespace GUI;

+0

是的,我有點忘了仍然需要閱讀我的代碼的人,謝謝你的評論!我將它放在前面的'GUI ::'中。至於把它變成命名空間,請閱讀我對Frerich Raabe的回答的編輯。 – Aerus 2010-12-17 14:38:04

1

如果你想要的只是簡短的人類可讀代碼,而不是由命名空間創建的實際分辨率,你可以使用typedef或宏來獲得所需的結果。

或者,您不需要在類或名稱空間中包含枚舉,除非您擔心命名衝突,在這種情況下,包括頭部的情況足以能夠創建方向變量或引用枚舉的方向成員直。