Пространство имен для одного метода c ++ - PullRequest
1 голос
/ 17 декабря 2010

Допустим, у меня есть заголовочный файл Snake.h:

#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, и я хотел бы сделать код более читабельным, предоставляя определенным методам определенные пространства имен, а не просто одно пространство имен для Snake.cpp. Это возможно?

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Обратите внимание, что в вашем примере 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 ...
}
1 голос
/ 17 декабря 2010

Если вам нужен просто короткий читаемый человеком код, а не реальное разрешение, созданное пространством имен, вы можете использовать typedef или макрос для достижения желаемых результатов.

В качестве альтернативы вам не нужно содержать свой enum вкласс или пространство имен, если вас не беспокоит конфликт имен, и в этом случае будет достаточно заголовка, чтобы иметь возможность создать переменную Orientation или напрямую ссылаться на направленные элементы перечисления.

1 голос
/ 17 декабря 2010

Поскольку GUI - это класс, просто будьте ясны и явны и напечатайте GUI::, чтобы каждый, кто читает код, знал контекст происходящего.Вы должны написать код только один раз с небольшим дополнительным набором текста, но людям, возможно, придется читать код годами.

РЕДАКТИРОВАТЬ: Альтернативно, если GUI не нужно , чтобы быть класс(Только enum s), измените его на пространство имен и выполните using namespace GUI; в вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...