2012-08-14 41 views
1

假設我有大意如下一個MessageBox類:我可以避免由特定類定義的限定名嗎?

class MyMessageBox 
{ 
public: 
    enum Priority { 
     Prior_Dialog, 
     Prior_Warning, 
     // ... 
    }; 

    enum Icon { 
     Icon_Question, 
     Icon_Exclamation, 
     // ... 
    }; 

    enum Button { 
     Button_Yes, 
     Button_No, 
     Button_Cancel, 
     // ... 
    }; 

    static void Show(Priority pPriority, Icon pIcon, Button pButton1, Button pButton2); 

    // ... 
}; 

現在,如果我想扔了一個消息,我必須爲每一個標識符類型進行MyMessageBox::

MyMessageBox::Show(MyMessageBox::Prior_Dialog, MyMessageBox::Icon_Question, MyMessageBox::Button_Yes, MyMessageBox::Button_No); 

理想,我想要一些非宏解決方案,它允許源文件#include "MyMessageBox.h"省去各地的MyMessageBox::資格。這可能嗎?

回答

4

也許如果枚舉和類在單獨命名空間的聲明(即枚舉應在類之外聲明),只是它很方便不污染全球名稱空間

namespace MessageBoxUtils { 

enum Priority { 
    Prior_Dialog, 
    Prior_Warning, 
    // ... 
}; 

enum Icon { 
    Icon_Question, 
    Icon_Exclamation, 
    // ... 
}; 

enum Button { 
    Button_Yes, 
    Button_No, 
    Button_Cancel, 
    // ... 
}; 

class MyMessageBox 
{ 
public: 
    static void Show(Priority pPriority, Icon pIcon, Button pButton1, Button pButton2); 

    // ... 
}; 

} // namespace MessageBoxUtils 

客戶端代碼(有些CPP文件):

#include ... 

using namespace MessageBoxUtils; 

... 

void SomeClass::Foo() 
{ 
    MyMessageBox::Show(Prior_Dialog, Icon_Question, ...); 
} 
+0

後續問題:我知道在頭文件中放置'using'聲明是一個很大的禁忌,但在這種情況下,將'使用MessageBoxUtils'直接放入'MyMessageBox.h'是可以接受的,這樣它會自動出現在每個使用它的源文件中? – suszterpatt 2012-08-14 19:17:17

+0

@suszterpatt,'在**頭文件中使用namespace'語句**是一種難聞的氣味,但它在實現(cpp)文件中很好。見http://stackoverflow.com/questions/4872373/why-is-including-using-namespace-into-a-header-file-a-bad-idea-in-c – 2012-08-14 19:29:26

7

是的,很簡單。如果你不想在課堂上使用enum,那麼......不要在課堂內定義它們。

enum Priority { 
    Prior_Dialog, 
    Prior_Warning, 
    // ... 
}; 

enum Icon { 
    Icon_Question, 
    Icon_Exclamation, 
    // ... 
}; 

enum Button { 
    Button_Yes, 
    Button_No, 
    Button_Cancel, 
    // ... 
}; 

class MyMessageBox 
{ 
public: 
    static void Show(Priority pPriority, Icon pIcon, Button pButton1, Button pButton2); 
// ... 
}; 
+0

或者,只能在類中調用它們。 – KRyan 2012-08-14 18:41:49

+0

Clobbers全局命名空間。曾聽說過'使用'? – krlmlr 2012-08-14 18:44:42

+0

@ user946850這裏沒有命名空間,只有一個類。 – 2012-08-14 18:45:23

0

你不能 「進口」 標識到全局命名空間由using關鍵字的方式:

using MyMessageBox::Prior_Dialog; // won't work 

(文檔上的第一眼誤導了我:http://msdn.microsoft.com/en-us/library/was37tzw%28v=vs.80%29.aspx

不過,我會建議將它們所屬的枚舉留在MessageBox類中。這避免了混淆和模糊 - 別人可以定義相同的枚舉項目,但爲其分配不同的值,導致編譯錯誤。

或者,您可以將類更改爲名稱空間,然後使用using「加載」標識符(或者甚至是整個名稱空間,如果您願意的話)。

其他可能的快捷方式包括:

  • typedef荷蘭國際集團的MessageBox類中的枚舉短方便識別,並以此作爲資格(哈克)

  • 複製個體常到您的命名空間,因爲他們(煩瑣)

  • ...?

0

另一種選擇是將你的枚舉放到與你的小部件相關的完全不同的命名空間中。例如,Qt庫就是這樣做的。他們把大量的枚舉的Qt命名空間,而不是把他們在特定類的

1

如果你要定義類的外部枚舉和你alsio要避免重複,避免枚舉名稱衝突的風險,可以考慮也是C++ 11 enum class可能性:

重新制定Luchian格里戈雷樣品

enum class Priority { 
    Dialog, 
    Warning, 
    // ... 
}; 

enum class Icon { 
    Question, 
    Exclamation, 
    // ... 
}; 

enum class Button { 
    Yes, 
    No, 
    Cancel, 
    // ... 
}; 

你現在被迫明確地使用枚舉符合它們,例如Button::Yes,Icon::Question等,並且你也被迫明確強制轉換爲int(不存在隱式轉換)

相關問題