Dr.Yevhenius
|
|
« : 27-12-2009 14:50 » |
|
У меня такой вопрос: можно ли создавать два экземпляра одного пространства имен? Скорее всего, вопрос непонятен, так что покажу с помощь кода: namespace main, sub1 { ... };
namespace main, sub2 { ... }
И в таком случае можно "подключать" либо всё либо отдельные блоки main'а или
|
|
« Последнее редактирование: 28-12-2009 05:48 от Inkognito »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 27-12-2009 15:00 » |
|
разве у пространства имён бывает экземпляр ?
Лучше, кстати, using не использовать (имхо), а явно указывать main::... , sub1::...
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #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.hnamespace string__ { ... }
namespace atec { using namespace string__; }
node.hnamespace node__ { ... }
namespace atec { using namespace node__; }
Форумы - полезная вещь: появляются хорошие идеи.
|
|
« Последнее редактирование: 27-12-2009 15:20 от Inkognito »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #3 : 27-12-2009 15:20 » |
|
А если ? В любом случае, акробатика с именами пространств имён - по-моему, плохая идея.
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #4 : 27-12-2009 15:22 » |
|
Вад, а если в h-файле 100 классов, и все они мне нужны. Писать 100 раз using atec::? А в atec, к примеру, 1000 классов, так что писать using namespace atec; не хотелось бы... В любом случае, акробатика с именами пространств имён - по-моему, плохая идея.
Не согласен. Акробатика с goto - плохая идея, но не с пр. имен
|
|
« Последнее редактирование: 27-12-2009 15:26 от Inkognito »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 27-12-2009 15:25 » |
|
Inkognito, 1)подумать, как не выводить классы наружу, чтоб не нужно было ими напрямую пользоваться 2) или... использовать оператор "::" вместо using
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #6 : 27-12-2009 15:28 » |
|
1)подумать, как не выводить классы наружу, чтоб не нужно было ими напрямую пользоваться
Для n-го количества проектов копировать тысячи строк кода? 2)...
Не хотелось бы для примера Ответ #4 : в 17:22:13 использовать ::
|
|
« Последнее редактирование: 27-12-2009 15:30 от Inkognito »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #7 : 27-12-2009 15:34 » |
|
Наверное, тогда лучше организовать, как в string.h: нужно писать только using std::string;, а сервисные методы (такие как strlen, strcmp...) и так работают...
|
|
« Последнее редактирование: 28-12-2009 05:47 от Inkognito »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 27-12-2009 15:37 » |
|
копировать не надо, надо лишь продумать один файл-инклуд , вернее, его классы и пространство имён в нём
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 27-12-2009 16:45 » |
|
Вад, а если в h-файле 100 классов, и все они мне нужны. Писать 100 раз using atec::?
А в atec, к примеру, 1000 классов
Это не "к примеру", это называется "сферический конь в вакууме". При правильной организации кода в одном месте никогда не возникнет 100 зависимостей одной единицы кода от других.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
lapulya
Молодой специалист
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
|
|
« Ответ #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)
|
|
« Ответ #12 : 28-12-2009 08:24 » |
|
1. не включай лишние хедеры 2. сделай вложенные namespace и включай каждое из под пространств отдельно 3. делай using для отдельного класса
|
|
|
Записан
|
Странно всё это....
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #13 : 28-12-2009 10:00 » |
|
В посте нумер 3 я перефразировал вопрос:
Цитата: Inkognito от Вчера в 19:17 Как дать одному пр. имен два имени
Если можно - то как? Если нельзя - то так и скажите.
Нельзя, потому что не нужно. Не нужно даже тебе. using всего namespace и отдельных элементов какого-то namespace достаточно для всех мыслимых и немыслимых (но реалистичных) случаев.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
lapulya
Молодой специалист
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
Молодой специалист
Offline
|
|
« Ответ #15 : 28-12-2009 11:06 » |
|
Inkognito, 2. Хорошо, раз согласен, пропускаем
3. Я все полностью прочитал, как раз там где ты говоришь про "подгрузку" нужной тебе части namspace (ну там пары классов например), при этом оставшуюся (не нужная тебе) часть ты бы "подгружать" не хотел. Против самого слова "подгрузка" (хотя я бы сказал что это именно использование, а не "подгрузка") в данном контексте я ничего не имел.
4. Мне не понятно замечание (твой четвертый пункт)... Если нужно использовать using namespace, да ради бога, где я сказал что это недопустимо? По поводу именования одного namespace двумя и более именами это невозможно, но это уже Вад сказал.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Вад
|
|
« Ответ #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
|
|
« Ответ #17 : 28-12-2009 13:14 » |
|
...
Я знаю, как описывать, работать, использовать namespace'и. В этом коде не было смысла. Inkognito, 3. Я все полностью прочитал, как раз там где ты говоришь про "подгрузку" нужной тебе части namspace (ну там пары классов например), при этом оставшуюся (не нужная тебе) часть ты бы "подгружать" не хотел. Против самого слова "подгрузка" (хотя я бы сказал что это именно использование, а не "подгрузка") в данном контексте я ничего не имел.
Вот здесь я уже заплутался. Если я действительно в чем-то не прав - прошу меня извинить. Вад, думаю мой вариант Ответа #2 лучше.
|
|
|
Записан
|
|
|
|
|