Как правильно использовать пространства имен, чтобы избежать конфликта имен? - PullRequest
4 голосов
/ 22 февраля 2011

Я немного сбит с толку относительно правильного использования пространств имен C ++. Для меня понятно, как они могут помочь избежать конфликтов (конфликт имен), но больше неясно, когда речь заходит о ключевом слове using. Я имею в виду, предположим, что у меня есть часть моего кода, которую я помещаю в пространство имен, и создаю класс, скажем

namespace my
{
    class vector { ... };
}

Конечно, когда я его использую, я бы не хотел все время печатать my::vector, поэтому я бы хотел using namespace my. Однако в конечном итоге мне может понадобиться что-то из пространства имен std, а затем я хочу одновременно using namespace std, но это вернет меня к первоначальной проблеме конфликта имен.

Я знаю, что можно "импортировать" только ту функциональность, которая мне нужна, например, using std::set, но в этом случае вполне естественно импортировать как стандартное пространство имен std, так и my пространство имен полностью, как я. буду использовать их все время.

Означает ли это, что даже когда я использую пространства имен, мне все равно следует подумать о присвоении необычных имен моим типам? Или using namespace является ошибкой, и я всегда должен вместо этого набирать my::vector? Благодаря.


Ну, я, наверное, должен уточнить, что это больше вопрос читабельности, чем печатать Многие :: везде выглядят очень странно для меня. Я знаю, что это вопрос вкуса и привычек, но тем не менее.

Ответы [ 3 ]

10 голосов
/ 22 февраля 2011

Конечно, когда я его использую, я не хотел бы постоянно набирать my :: vector, поэтому я бы хотел использовать пространство имен my.Однако в конечном итоге мне может понадобиться что-то из пространства имен std, а затем я хочу одновременно использовать пространство имен std, но это вернет меня к первоначальной проблеме конфликта имен.

Да, это вернет вас к первоначальной проблеме конфликта имен.Вот почему вы должны использовать директивы using namespace ...; экономно, а только в исходных файлах, а не в заголовках .

Означает ли это, что даже когда я использую пространства имен, я все равно должен думатьо присвоении необычных имен моим типам?

Нет, вы не должны.Пространства имен были изобретены именно для того, чтобы этого избежать.

Или использование пространства имен является ошибкой, и я всегда должен вместо этого набирать my :: vector?

Вы можете, если хотите, использовать директивы using namespace ...; или using ...;, пока не получите конфликты.Это означает, что когда у вас do возникают конфликты, вы в конечном итоге будете писать "неестественный" код, явно опуская имена в некоторых местах.

На практике, когда вы имеете дело с коротким пространством именимена (то есть std), вы можете просто вводить их явно все время.Примерно через неделю вы даже не заметите, что печатаете его больше.

4 голосов
/ 22 февраля 2011

Если ваш код использует как std::vector, так и my::vector, тогда всегда лучше писать имена полностью.

0 голосов
/ 22 февраля 2011

Зачем вообще ставить его в пространство имен, если вы немедленно снова открываете пространство имен?С тем же успехом вы могли бы поместить класс в глобальное пространство имен!

Это также очень сбило бы с толку тех, кто не заметил директиву using в верхней части вашего файла, этот вектор не является std::вектор.Это само по себе является причиной для написания my :: vector!

. Мне кажется, что такие имена, как std :: vector и std :: list улучшают читаемость , потому что я сразу знаю, что это такоеимена означают.

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