Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как дать одному namespace два имени  (Прочитано 17589 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 27-12-2009 14:50 » 

У меня такой вопрос: можно ли создавать два экземпляра одного пространства имен? Скорее всего, вопрос непонятен, так что покажу с помощь кода:
Код:
namespace main, sub1
{
...
};

namespace main, sub2
{
...
}

И в таком случае можно "подключать" либо всё
Код:
using namespace main;
либо отдельные блоки main'а
Код:
using namespace sub1;
или
Код:
using namespace sub2;
« Последнее редактирование: 28-12-2009 05:48 от Inkognito » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 27-12-2009 15:00 » 

разве у пространства имён бывает экземпляр ?

Лучше, кстати, using не использовать (имхо), а явно указывать main::... , sub1::...
Записан

Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 27-12-2009 15:17 » 

разве у пространства имён бывает экземпляр ?
Я же говорил - вопрос будет непонятен Отлично

Лучше, кстати, using не использовать (имхо), а явно указывать main::... , sub1::...
Ага, я знаю, но я не о том.

Хорошо... Как дать одному пр. имен два имени.
Обьясню поподробней...
Есть несколько h-файлов: xstring.h, node.h, exceptio.h и т. д. Каждый файл - часть описания пространства имен atec. При подключении всех этих h-файлов получается один громадный и функциональный atec. Но стоит мне написать using namespace atec; (будим исходить, что использовать using namespace мне жизненно важно Улыбаюсь ), так оно "подгрузит" (или как правильнее сказать) всё: xstring, node... А я хочу "подгружать" (возмем для примера string) не весь atec, а только string - using namespace string;, который является частью atec.

Улыбаюсь Пока писал, родилась идея.
string.h
Код:
namespace string__
{
...
}

namespace atec
{
    using namespace string__;
}
node.h
Код:
namespace node__
{
...
}

namespace atec
{
    using namespace node__;
}
Форумы - полезная вещь: появляются хорошие идеи. Отлично
« Последнее редактирование: 27-12-2009 15:20 от Inkognito » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 27-12-2009 15:20 » 

А если
Код:
using atec::string
?

В любом случае, акробатика с именами пространств имён - по-моему, плохая идея.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 27-12-2009 15:22 » 

Вад, а если в h-файле 100 классов, и все они мне нужны. Писать 100 раз using atec::?

А в atec, к примеру, 1000 классов, так что писать using namespace atec; не хотелось бы...


В любом случае, акробатика с именами пространств имён - по-моему, плохая идея.
Не согласен. Акробатика с goto - плохая идея, но не с пр. имен
« Последнее редактирование: 27-12-2009 15:26 от Inkognito » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 27-12-2009 15:25 » 

Inkognito,
 1)подумать, как не выводить классы наружу, чтоб не нужно было ими напрямую пользоваться

 2) или... использовать оператор "::" вместо using Отлично
Записан

Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 27-12-2009 15:28 » 

1)подумать, как не выводить классы наружу, чтоб не нужно было ими напрямую пользоваться
Для n-го количества проектов копировать тысячи строк кода?

2)...
Не хотелось бы для примера Ответ #4 : в 17:22:13 использовать :: Улыбаюсь
« Последнее редактирование: 27-12-2009 15:30 от Inkognito » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #7 : 27-12-2009 15:34 » 

Наверное, тогда лучше организовать, как в string.h: нужно писать только using std::string;, а сервисные методы (такие как strlen, strcmp...) и так работают...
« Последнее редактирование: 28-12-2009 05:47 от Inkognito » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 27-12-2009 15:37 » 

копировать не надо, надо лишь продумать один файл-инклуд , вернее, его классы и пространство имён в нём Улыбаюсь
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 27-12-2009 16:45 » 

Цитата: Inkognito
Вад, а если в h-файле 100 классов, и все они мне нужны. Писать 100 раз using atec::?

А в atec, к примеру, 1000 классов
Это не "к примеру", это называется "сферический конь в вакууме".

При правильной организации кода в одном месте никогда не возникнет 100 зависимостей одной единицы кода от других.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #10 : 27-12-2009 22:48 » 

Inkognito,
1. Никто не запрещает вкладывать namespace друг в друга (так обычно и делается в больших проектах), это полностью решает твою проблему.

2. Если в одном файле (h) объявлено несколько классов, это плохая организация кода (ну только если они не ппц как тесно связаны, да и то с оговорками, и конечно их не 100 и даже не 10, а меньше), как по мне 1 класс 1 h файл (типа 1 выстрел - 1 труп Улыбаюсь шучу). 100 классов в одном файле это труба!

3. что значит твоя фраза про
Цитата
"подгрузит"
, я так и не понял... есть библиотека (пусть stl), там есть класс (vector), я пользуюсь только некоторыми функциями (ну например оператором []), а другие не использую (push_back), как мне "не подгружать" ненужные мне функции - это вопрос сродни твоему.

4. ничего никуда копировать не надо, можно использовать using, можно не использовать (я, как правило, не использовал, более того делал typedef std::string String, далее юзался String)
Записан

С уважением Lapulya
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #11 : 28-12-2009 05:43 » 

Inkognito,
1. Никто не запрещает вкладывать namespace друг в друга (так обычно и делается в больших проектах), это полностью решает твою проблему.
Откомпилируй это
Код:
namespace mainn
{
namespace sub1
{
void foo1() { printf("foo1"); }
};
};

namespace mainn
{
namespace sub2
{
void foo2() { printf("foo2"); }
};
};

using namespace mainn;

int main(int argc, char* argv[])
{
foo1();
foo2();
system("PAUSE");
return 0;
}
и розкажи как неработоспособность этого кода решает мою проблему с помощью вложения namespace'ов.

2. Если в одном файле (h) объявлено несколько классов, это плохая организация кода (ну только если они не ппц как тесно связаны, да и то с оговорками, и конечно их не 100 и даже не 10, а меньше), как по мне 1 класс 1 h файл (типа 1 выстрел - 1 труп Улыбаюсь шучу). 100 классов в одном файле это труба!
Ну хоть с чем-то в твоем посте и посте Dimka я согласен: да, пример очень плохой.

3. что значит твоя фраза про
Цитата
"подгрузит"
, я так и не понял... есть библиотека (пусть stl), там есть класс (vector), я пользуюсь только некоторыми функциями (ну например оператором []), а другие не использую (push_back), как мне "не подгружать" ненужные мне функции - это вопрос сродни твоему.
Во-первых: научись читать более 1-го слова подряд:
"подгрузит" (или как правильнее сказать)
Хочешь исправить на правильный вариант - пожалуйста, буду благодарен...
Во-вторых: ничего ты совсем не понял (или "не поняла": то ты пишешь в своих постах "...не использовал...", то "...со всем согласная я..."; чет я запутался, кто ты: "он" или "она" Да что ты говоришь?.. или вас несколько человек Улыбаюсь ): я о "подгрузке" или "неподгрузке" методов ничего не говорил.

4. ничего никуда копировать не надо, можно использовать using, можно не использовать (я, как правило, не использовал, более того делал typedef std::string String, далее юзался String)
Прям философский вопрос Отлично.
Ну а если серьйозно, я же, вродь, русским написал:
(будим исходить, что использовать using namespace мне жизненно важно )

А вообще залезли мы в дебри... В посте нумер 3 я перефразировал вопрос:
Как дать одному пр. имен два имени
Если можно - то как? Если нельзя - то так и скажите. Я сам потом решу: плохо это или нет.
« Последнее редактирование: 28-12-2009 05:50 от Inkognito » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #12 : 28-12-2009 08:24 » 

1. не включай лишние хедеры
2. сделай вложенные namespace и включай каждое из под пространств отдельно
3. делай using для отдельного класса
Записан

Странно всё это....
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 28-12-2009 10:00 » 

Цитата: Inkognito
В посте нумер 3 я перефразировал вопрос:

Цитата: Inkognito от Вчера в 19:17
Как дать одному пр. имен два имени

Если можно - то как? Если нельзя - то так и скажите.
Нельзя, потому что не нужно. Не нужно даже тебе. using всего namespace и отдельных элементов какого-то namespace достаточно для всех мыслимых и немыслимых (но реалистичных) случаев.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #14 : 28-12-2009 10:53 » 

Inkognito, во ты напрыгнул... итак попорядку
1. я не говорил что любой твой код будет компилиться, надо ж правила соблюдать, вот такие варианты прикладного кода будут (должны) компилиться:
a)
Код:
using namespace mainn::sub1;
using namespace mainn::sub2;

int main(int argc, char* argv[])
{
foo1();
foo2();
return 0;
}

b1)
Код:
typedef mainn::sub1::foo1 foo1;
typedef mainn::sub1::foo2 foo2;

int main(int argc, char* argv[])
{
foo1();
foo2();
return 0;
}

b2)
Код:
using namespace mainn;
typedef sub1::foo1 foo1;
typedef sub1::foo2 foo2;

int main(int argc, char* argv[])
{
foo1();
foo2();
return 0;
}

c)
Код:
int main(int argc, char* argv[])
{
mainn::sub1::foo1();
mainn::sub1::foo2();
return 0;
}

d)
Код:
typedef mainn;

int main(int argc, char* argv[])
{
sub1::foo1();
sub2::foo2();
return 0;
}
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #15 : 28-12-2009 11:06 » 

Inkognito,
2. Хорошо, раз согласен, пропускаем

3. Я все полностью прочитал, как раз там где ты говоришь про "подгрузку" нужной тебе части namspace (ну там пары классов например), при этом оставшуюся (не нужная тебе) часть ты бы "подгружать" не хотел. Против самого слова "подгрузка" (хотя я бы сказал что это именно использование, а не "подгрузка") в данном контексте я ничего не имел.

4. Мне не понятно замечание (твой четвертый пункт)... Если нужно использовать using namespace, да ради бога, где я сказал что это недопустимо? По поводу именования одного namespace двумя и более именами это невозможно, но это уже Вад сказал.
Записан

С уважением Lapulya
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 28-12-2009 12:34 » 

Если нужно использовать using namespace, да ради бога, где я сказал что это недопустимо? По поводу именования одного namespace двумя и более именами это невозможно, но это уже Вад сказал.
Это был не я, я только намекнул Улыбаюсь Хотя я знаю один способ назвать namespace двумя именами. Только это очень жёсткий антипаттерн, и в жизни никому и никогда не посоветую так делать. Но тем не менее:

Код:
// test.h
#ifdef NAMESPACE_MAIN
namespace main {
#else
namespace space1 {
#endif

// ...

};
Код:
define NAMESPACE_MAIN
#include "test.h"
using namespace main;

Ещё раз замечу, я этого не предлагал! Улыбаюсь
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #17 : 28-12-2009 13:14 » new

...
Я знаю, как описывать, работать, использовать namespace'и. В этом коде не было смысла.

Inkognito,
3. Я все полностью прочитал, как раз там где ты говоришь про "подгрузку" нужной тебе части namspace (ну там пары классов например), при этом оставшуюся (не нужная тебе) часть ты бы "подгружать" не хотел. Против самого слова "подгрузка" (хотя я бы сказал что это именно использование, а не "подгрузка") в данном контексте я ничего не имел.
Вот здесь я уже заплутался. Если я действительно в чем-то не прав - прошу меня извинить.

Вад, думаю мой вариант Ответа #2 лучше.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines