2012-08-14 43 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(不存在隐式转换)

相关问题