С++: "Пространства имен классов"?
Если в С++ у меня есть класс longUnderstandableName
. Для этого класса у меня есть заголовочный файл, содержащий его объявление метода. В исходном файле для класса я должен писать longUnderstandableName::MethodA
, longUnderstandableName::MethodB
и т.д. Всюду.
Можно ли каким-то образом использовать пространства имен или что-то еще, поэтому я могу просто написать MethodA
и MethodB
в исходном файле класса и только там?
Ответы
Ответ 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", чтобы вырезать префиксы.