Подтвердить что ты не робот

С++: "Пространства имен классов"?

Если в С++ у меня есть класс longUnderstandableName. Для этого класса у меня есть заголовочный файл, содержащий его объявление метода. В исходном файле для класса я должен писать longUnderstandableName::MethodA, longUnderstandableName::MethodB и т.д. Всюду.

Можно ли каким-то образом использовать пространства имен или что-то еще, поэтому я могу просто написать MethodA и MethodB в исходном файле класса и только там?

4b9b3361

Ответ 1

typedef longUnderstandableName sn;

Затем вы можете определить методы как

void sn::MethodA() {}
void sn::MethodB() {}

и использовать их как

sn::MethodA();
sn::MethodB();

Это работает, только если longUnderstandableName - это имя класса. Он работает, даже если класс глубоко внедрен в другое пространство имен.

Если longUnderstandableName - это имя пространства имен, то в пространстве имен (или исходном файле), где вы хотите использовать методы, вы можете написать

using namespace longUnderstandableName;

а затем вызовите методы типа

MethodA();
MethodB();

Вы должны быть осторожны, чтобы не использовать using namespace foo; в заголовочных файлах, потому что тогда он загрязняет каждый .cpp файл, который мы #include заголовочный файл, но используя using namespace foo; в верхней части .cpp файл определенно разрешен и поддерживается.

Ответ 2

Внутри методов классов вы можете использовать имя без квалификации, так или иначе: просто снимите префикс longUnderstandableName::.

В функциях внутри исходного файла класса, которые не являются методами, я предлагаю ввести статические встроенные функции с файловой областью, например:

inline type MethodA(type param){
    return longUnderstandableName::MethodA(param);
}

Затем вы можете вызвать MethodA unqualified; из-за встроенного характера, это, вероятно, не будет стоить затрат времени на выполнение.

Ответ 3

Я не уверен, что рекомендую его, но вы можете использовать макрос вроде:

#define sn LongUnderstandableName

void sn::MethodA(parameters) { ... }
int sn::MethodB(parameters) { ... }

и т.д. Одна из плохих точек макросов заключается в том, что они не учитывают область видимости, но в этом случае область, которую вы (по-видимому) хотите, является исходным файлом, который, как представляется, соответствует (довольно близко) с объемом макроса.

Ответ 4

Хорошо, да, когда вы понимаете пространства имен.

Вместо того, чтобы называть ваш класс MyBonnieLiesOverTheOcean, вместо этого установите следующее:

namespace My { namespace Bonnie { namespace LiesOverThe {
   class Ocean { ... };
} } }

Теперь, когда вы определяете свои методы, вы помещаете те же пространства имен вокруг всего файла, и вы пишете:

Ocean::SomeMethod() ...

При использовании класса извне все пространства имен это:

My::Bonnie::LiesOverThe::Ocean

Если вам нужно ссылаться на многие вещи из какого-либо другого пространства имен в каком-то исходном файле, вы можете использовать директиву "use", чтобы вырезать префиксы.