2010-12-17 62 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或宏来获得所需的结果。

或者,您不需要在类或名称空间中包含枚举,除非您担心命名冲突,在这种情况下,包括头部的情况足以能够创建方向变量或引用枚举的方向成员直。