|
|
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Как реализовать сабж? Это возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:13 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhКак реализовать сабж? Это возможно? Первое что пришло в голову Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:28 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Структура классов точно такая, как ты написал. Но предполагается, что я не знаю какие классы у меня будут. Эти классы (в библиотеках) будут слинкованы вместе с программой. А название класса будет в виде строки передоваться в конструктор другого класса (он понятия не имеет о возможных вариантах), который будет создавать требуемый класс и пользовать его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:32 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
вроде бы таких вещей надо избегать в с++. Интересно узнать, зачем понадобилось такое извращение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:33 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
ZeusTheTrueGodвроде бы таких вещей надо избегать в с++. Интересно узнать, зачем понадобилось такое извращение? Эти все классы являются некоторыми уровнями. Данные по ним бегут туда сюда. Но, всявязи с тем, что железки бывают разными (ком порты, езернет, всякая специализация), надо иметь возможность гибко подменять уровни. Т.е. я линкую нужные мне библиотеки, и уровню 2 говорю: будешь пользовать вот этот класс как уровень 1. Таким образом можно избежать модификацию библиотеки уровня 2, в тех случаях, когда появляются новые уровни 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:40 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhСтруктура классов точно такая, как ты написал. Но предполагается, что я не знаю какие классы у меня будут. Эти классы (в библиотеках) будут слинкованы вместе с программой. А название класса будет в виде строки передоваться в конструктор другого класса (он понятия не имеет о возможных вариантах), который будет создавать требуемый класс и пользовать его. Не знаю, я сильно сомневаюсь в том что обычными средствамя С++ можно создать объект, тип которого не известен при компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:46 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Sandro_KНе знаю, я сильно сомневаюсь в том что обычными средствамя С++ можно создать объект, тип которого не известен при компиляции. Я тоже не уверен, но во всяком случае в исполняемом файле есть его имя (но, понаятно, что это еще ни о чем не говорит, просто как мысля). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:53 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Akh ZeusTheTrueGodвроде бы таких вещей надо избегать в с++. Интересно узнать, зачем понадобилось такое извращение? Эти все классы являются некоторыми уровнями. Данные по ним бегут туда сюда. Но, всявязи с тем, что железки бывают разными (ком порты, езернет, всякая специализация), надо иметь возможность гибко подменять уровни. Т.е. я линкую нужные мне библиотеки, и уровню 2 говорю: будешь пользовать вот этот класс как уровень 1. Таким образом можно избежать модификацию библиотеки уровня 2, в тех случаях, когда появляются новые уровни 1. Я не совсем все понял, но помоему тут можно сделать так чтоб в каждой библиотеке была функция типа: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 14:55 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Sandro_KЯ не совсем все понял, но помоему тут можно сделать так чтоб в каждой библиотеке была функция типа: Код: plaintext 1. 2. 3. 4. К сожалению такой вариант не пройдет, т.к. может быть подключено быть несколько библиотек (например, в горячую перейти на другой тип уровня 1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 15:13 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhКак реализовать сабж? Это возможно? Рекомендую глянуть книгу Джэфа Элджера. подзаголовок - библиотека программиста..а название "C++" в инете сможете найти в электронном виде. Обложка мягкого, маленького формата, чёрный фон. там найдёте и "виртуальные" конструкторы и альтернативу всяким ифам-свитчам и многое ышо интересных мыслей (грани, мудрые указатели, кристаллы). Так же затрагивалась и Ваша тема. Если по вопросу... То... Вам предложили вариант с базовым классом. В принцепе этого достаточно (ну почти) чтоб решить Ваши проблемы. Сюда добавить механизацию от Элджера в ввиде "двойной передачи" данных и мне так икается - получите то чего хотели. Но тут правильно заметили - одна из сильных сторон си плас пласа - типизация. с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 15:19 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
kolobok0 Рекомендую глянуть книгу Джэфа Элджера. подзаголовок - библиотека программиста..а название "C++" в инете сможете найти в электронном виде. Обложка мягкого, маленького формата, чёрный фон. там найдёте и "виртуальные" конструкторы и альтернативу всяким ифам-свитчам и многое ышо интересных мыслей (грани, мудрые указатели, кристаллы). Так же затрагивалась и Ваша тема. Если по вопросу... То... Вам предложили вариант с базовым классом. В принцепе этого достаточно (ну почти) чтоб решить Ваши проблемы. Сюда добавить механизацию от Элджера в ввиде "двойной передачи" данных и мне так икается - получите то чего хотели. Но тут правильно заметили - одна из сильных сторон си плас пласа - типизация. с уважением (круглый) За совет спасибо - встретится посмотрю. Если будут предложены варианты без потери типизации буду только рад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 15:33 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhЕсли будут предложены варианты без потери типизации буду только рад. кстати посомтрите в сторону COMа. Именно такие задачи он и решает с успехом. Вы получаете интерфейс и далее работаете с ним. Вокруг интерфейса обычно строиться врапер. С точки зрения Вашей логики (юзанья уровней) - Вам не нужен явный класс как таковой, Вам важнее тот функционал который Вы будете использовать на данном уровне. Значит напрашиваются классы отображающие не объекты взаимодействия, а ту часть объекта функционал которой Вам нужен для конкретного действия. Например...(в терминах Джэфа Элджера)... Вам нужно ампутировать "голову" у некой сущнсоти... Есть непонятно что...(ссылка на нечто - не важно).. создаём класс голова и как входные параметры передаём ссылку на "нечто". Далее нам нужно узнать - голова ты ликвидна ? И если ответ положительный - ампутируем... автоматизация самой головы заключается в том(как один из вариантов), что можно вызвать у переданного "нечто" предопределённый метод (например из базового), с передачей типа "голова" как входной параметр... Что позволит автоматически вызвать тот обработчик у этого "нечто" на тип "голова"... в данной точке все типы нам известны (оказалась кошка) - можем проинициализировать голову и далее по контексту.... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 16:00 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
kolobok0кстати посомтрите в сторону COMа. ... Вам нужно ампутировать "голову" у некой сущнсоти... ... Не думал, что в такие дебри заведет данный вопрос. Всвязи с этим надо уточнить, что проект под Линукс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 16:15 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhНе думал, что в такие дебри заведет данный вопрос. Всвязи с этим надо уточнить, что проект под Линукс. а при чём тут Линукс (Вас COM возбудил ? :) ) ? Да хоть Novell. COM - методология. Или Вы утверждаете что методология зависит от платформы ? Тогда ышо рекомендую прочитать книжку "Основы COM". Особенно первые главы - там где говориться, что это такое. с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 16:23 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
kolobok0 AkhНе думал, что в такие дебри заведет данный вопрос. Всвязи с этим надо уточнить, что проект под Линукс. а при чём тут Линукс (Вас COM возбудил ? :) ) ? Да хоть Novell. COM - методология. Или Вы утверждаете что методология зависит от платформы ? Тогда ышо рекомендую прочитать книжку "Основы COM". Особенно первые главы - там где говориться, что это такое. С комом знаком поскольку-постольку в виндах. Использовал только один раз и то по примерам, поэтому счел нужным уточнить платформу. Вряд ли я буду изучать ком только из-за этого. Может я и ошибаюсь, но решение с помощью вышеописанной методики мне кажется черезчур громоздким. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 16:41 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Сам СОМ только изучаю и пока написал только один мало мальски достойный проэкт. Но вся идея заклюяаеться в том что у тебя есть указатель на интерфейс (Элджер это называет гранью), т.е. например Код: plaintext 1. 2. 3. Код: plaintext 1. Код: plaintext 1. 2. 3. Например имя библиотеки DLL и имя класса. Библиотека загружаеться динамически и у нее запрашиваеться нужная реализация интерфейса. В этом случаи необходимо обеспечить только чтобы библиотека экспортировала нужную ф.(хотя и ее можно считывать динамически), ну и чтобы библиотека знала по именам все классы принадлежащие только ЕЙ. СОМ в принципе этим и занимаеться. Есть идентификатор класса который запрашиваеться. Далее у этого класса запрашиваеться интерфейс. Сам объект может распологаться при этом где угодно в сети и обслуживать сколько угодно клиентов. Но если тебе это не надо то можно наверное и сделать нечто самому. На счет поддержки Линуксом КОМ я точно не скажу, но вроде должен поддерживаться. ЗЫ. На счет книжек. Мне очень понравился Дональд Бокс. "Сущность технологии COM.". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 18:42 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
moteus Далее в программе ты запрашиваешь нужную реализацию ИНТУРФЕЙСА Код: plaintext 1. 2. 3. Например имя библиотеки DLL и имя класса. Я с COM никогда не работал. Мне вот интересно как функция GetMeWorkInterface(ClassDesc); реализуется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 20:57 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
moteusЗЫ. На счет книжек. Мне очень понравился Дональд Бокс. "Сущность технологии COM.". the best. Sandro_K, любой объект ком знает какие интерфейсы он может предоставить. Если ты его просишь предоставить другой интерфейс - он не сделает это. Для твоего случая - есть группы COM объектов, для которых можно выполнить функцию "Дать мне CLSID всех комобъектов группы", а потом у какого хочешь можешь попробовать взять интерфейс. На самом деле есть еще и CORBA, которая таки работает под Linux:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 00:32 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
moteusСам СОМ только изучаю и пока написал только один мало мальски достойный проэкт. Но вся идея заклюяаеться в том что у тебя есть указатель на интерфейс (Элджер это называет гранью), т.е. например Код: plaintext 1. 2. 3. Код: plaintext 1. Код: plaintext 1. 2. 3. Например имя библиотеки DLL и имя класса. Библиотека загружаеться динамически и у нее запрашиваеться нужная реализация интерфейса. В этом случаи необходимо обеспечить только чтобы библиотека экспортировала нужную ф.(хотя и ее можно считывать динамически), ну и чтобы библиотека знала по именам все классы принадлежащие только ЕЙ. О это страшное слово СОМ! :) Шутка Прочитал 2 раза, но не понял: в чем здесь приемущества по сравнению с вариантом, который предложил Sandro_K в самом начале топика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 09:55 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
То что я написал есть первое приближение к СОМ. AkhПрочитал 2 раза, но не понял: в чем здесь приемущества по сравнению с вариантом, который предложил Sandro_K в самом начале топика? Принцип тот же. Я просто хотел показать что имена классов не обязательно должны быть известны на момент компиляции. Я незнаю линукс. Для винодовс можно реализовать по принципу. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Создаешь отдельную ДЛЛ в которой реализуешь класс TIthernet. и ф. GetWorkObject которая принимая строку("ClassIthernet") возвращает указатель типа IWorkIntarface. Далее напр. в INI пишешь [CLASS_22] DLL="Ithernet.dll" CLSID="ClassIthernet" и все. При этом не надо ни переписывать ни перекомпилировать вызывающую программу. Сразу предупреждаю что это чисто теоретические рассуждения. Пускай более опытные коллеги подправят если что. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 15:15 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
moteus //? Вроде объекты из кучи не должны уничтожиться при выгрузке Объекты наверно не уничтожатся, но методы этих классов скорее всего реализованы будут внутри библиотеки, так что FreeLibrary(hLib); надо наверно вызывать только когда уничтожаться будет объект, хотя я в этом не разбираюсь. В линуксе что-то подобное можно сделать, это точно. У нас на работе один чел что-то похожее пытался сделать, но у него возникли какие-то проблемы, и это так и не было доделано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 15:42 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Согласен. Надо чтоб при удалении последнего объекта библиотека сама выгружалась. Это уже совсем СОМ получаеться :). Но это не так все и реализовать если есть всего один клиент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 16:01 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
moteusТо что я написал есть первое приближение к СОМ. Т.е. тот же вариант (усложненный), но реализованный в виде отдельной библиотеки, которую надо будет перекомпилять. Не хочется городить из мухи слона (плодить модули), если программа сама сможет определить адрес, то создавать новый модуль (связки) не рационально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2006, 16:30 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Akh, вам нужно автоматизировать построение списка пар "Имя класса"->"Указатель на функцию, возвращающую экземпляр класса" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 06:57 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
BarloneAkh, вам нужно автоматизировать построение списка пар "Имя класса"->"Указатель на функцию, возвращающую экземпляр класса" ? Что-то вроде этого... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 10:24 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Akh BarloneAkh, вам нужно автоматизировать построение списка пар "Имя класса"->"Указатель на функцию, возвращающую экземпляр класса" ? Что-то вроде этого... макрос DECLARE_DYNCREATE делает примерно тоже самое. после определения этого макроса внутри класса (потомка Object) возможно создание его создание в рантайм ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 12:44 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
MElinмакрос DECLARE_DYNCREATE делает примерно тоже самое. после определения этого макроса внутри класса (потомка Object) возможно создание его создание в рантайм Внял совету, почитал А мне его взять то, если я на gcc? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 12:56 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Akh MElinмакрос DECLARE_DYNCREATE делает примерно тоже самое. после определения этого макроса внутри класса (потомка Object) возможно создание его создание в рантайм Внял совету, почитал А мне его взять то, если я на gcc? Так то ж MFC )) Но полезно будет почитать про RTTI от Borland и CRuntimeClass и иже с ним от Microsoft, принципы, реализация... чтоб своё наваять или может под gcc что-то подобное найдёшь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 13:14 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Насколько я понял по afx.h в имплемент имя класса передается не в виде строки. Так, что это не то что нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 13:54 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhА мне его взять то, если я на gcc? Можешь заюзать Qt, там есть такая возможность, смотри QMetaType у него есть метод construct. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 15:54 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
a_sharМожешь заюзать Qt, там есть такая возможность, смотри QMetaType у него есть метод construct. Там имя класса передается в виде строки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2006, 16:19 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Задача решается в полсотни строк, причем достаточно элегантно. Идея достаточно проста: заводится статический ассоциативный контейнер, в который в момент загрузки программы заносятся объекты, способные создавать прикладные объекты соответствующего класса. М-да непонятно получилось, лучше посмотреть на код. Там все гораздо понятнее. Могу прислать готовый заголовочный файл с тестовым случаем. Писать vaska@b-k.ru # ifndef _FACTORY_H # define _FACTORY_H # include <map> // База для вспомогательных классов // с помощью которых будут создаваться // прикладные объекты. Умеет также зарегистрировать // себя в ассоциативном контейнере. template <typename K, typename T> class FactoryHelperBase { public: virtual ~FactoryHelperBase() {}; virtual T* clone() const = 0; protected: void install(const K&); }; // Собственно фабрика объектов. К которой следует обращаться // для создания обьектов, содержит внутри себя map // вспомогательнвх классов (см выше). Создание нового объекта // очень элегантно // MyBase* myBase = Factory<std::string, MyBase>::make(“MyChild”); template <typename K, typename T> class Factory { public: typedef FactoryHelperBase<K, T> Creator; private: friend class Creator; typedef std::map<K, Creator*> Buffer; static Buffer buf; public: static T* make(const K& k) { typename Buffer::const_iterator i = buf.find(k); if ( i == buf.end()) return 0; return i->second->clone(); } }; template <typename K, typename T> inline void FactoryHelperBase<K, T>::install(const K& k) { Factory<K, T>::buf[k] = this; } // Набор макросов с помощью которых в некоторой единице // компиляции создается фабрика. // выглядит это так // DECLARE_FACTORY(std::string, MyBase) // ADD_FACTORY(“MyClass”, MyClass); // END_DECLARE_FACTORY # define DECLARE_FACTORY(K, T) \ namespace \ { \ typedef Factory<K, T> factory; \ typedef T value_type; \ typedef K key_type; \ factory::Buffer factory::buf; # define END_DECLARE_FACTORY } # define ADD_FACTORY(k, t) \ class factoryHelper##t : public factory::Creator \ { \ public: \ factoryHelper##t() { install(key_type(k)); } \ value_type* clone() const { return new t; } \ }; \ static factoryHelper##t factoryHelper##t##install # endif // _FACTORY_H ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2006, 11:51 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
a_shar AkhА мне его взять то, если я на gcc? Можешь заюзать Qt, там есть такая возможность, смотри QMetaType у него есть метод construct. Код: plaintext 1. 2. 3. 4. 5. 6. 7. в объявление класса вставь Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2006, 13:22 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
a_shar a_shar AkhА мне его взять то, если я на gcc? Можешь заюзать Qt, там есть такая возможность, смотри QMetaType у него есть метод construct. Код: plaintext 1. 2. 3. 4. 5. 6. 7. в объявление класса вставь Код: plaintext 1. 2. У Qt две беды 1 необхобимость тащить ее с собой, что не всегда оправдано. Например демона написать. 2 возвращает такая фабрика void*. Эта беда пострашнее. Дело в том, что родитель в наследнике может размещаться совсем не 0 смещением. Например в случае множественного наследования. И как в таком случае приводить тип? PS На attachment тестовый пример повесил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2006, 19:50 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedЗадача решается в полсотни строк, причем достаточно элегантно. Идея достаточно проста: заводится статический ассоциативный контейнер, в который в момент загрузки программы заносятся объекты, способные создавать прикладные объекты соответствующего класса. М-да непонятно получилось, лучше посмотреть на код. Там все гораздо понятнее. Могу прислать готовый заголовочный файл с тестовым случаем. Писать vaska@b-k.ru ... Решение, действительно красивое. Разбираюсь. Не могу понять почему: Код: plaintext 1. 2. 3. 4. 5. 6. По всей видимости, компилятор не удиляет внимания наймспейсу из DECLARE_FACTORY? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2006, 10:41 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
И не пытайтесь слинковать две фабкики с одинаковыми параметрами в один исполняемый модуль. Ну ничего не выйдет. Она объявлена все какаого либо namespace. А безымянный namespace в макросах заведен typedef внутри него не пересеклись с кем-нибудь. Рад что понравилосьЖ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2006, 18:19 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Средствами C++ (самого языка) вам это не сделать. Таких средств нет. Надо писать . Это называвется Class Factory, это pattern такой, описано в GoF и еще в других источниках. Читайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2006, 16:09 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
MasterZivСредствами C++ (самого языка) вам это не сделать. Таких средств нет. Надо писать . Это называвется Class Factory, это pattern такой, описано в GoF и еще в других источниках. Читайте. Хотоший совет. Вот только у Банды 4-х как раз switch и нарисован. Лучше почитать Александреску Modern C++ Design ... Там целая глава по этому поводу. А еще интересная фабрика у Дага Шмидта Network Programming using C++ vol 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 14:57 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Sandro_KВ линуксе что-то подобное можно сделать, это точно. У нас на работе один чел что-то похожее пытался сделать, но у него возникли какие-то проблемы, и это так и не было доделано.угу, мне сказали, в лине нет дллок, есть разделяемые библиотеки, но они грузятся только при загрузке приложения. Akh, я так понял, ты подгружаешь библиотеку в рантайме. Расскажи, как. Интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 15:55 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmoугу, мне сказали, в лине нет дллок, есть разделяемые библиотеки, но они грузятся только при загрузке приложения. Akh, я так понял, ты подгружаешь библиотеку в рантайме. Расскажи, как. Интересно. Я использую статичесткие, т.к. в данном проекте нет смысла использовать разделяемые. Если интересна эта тема, можно посмотреть например тут . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 17:06 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
эээ... и как ты собираешься с помощью статических библиотек добавлять новый класс без перекомпиляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 17:16 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmoэээ... и как ты собираешься с помощью статических библиотек добавлять новый класс без перекомпиляции? [...наивный взгляд...] как blinded объяснял. Мне не нужна перекомпиляция. Только линковка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 17:20 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
компиляция только самого приложения и линковка с библиотеками. да бы не перекомпиливать библиотеки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 17:26 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Akh BarloneAkh, вам нужно автоматизировать построение списка пар "Имя класса"->"Указатель на функцию, возвращающую экземпляр класса" ?Что-то вроде этого...если юзать лишь статические бибки, могу предложить такое... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 17:49 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhМне не нужна перекомпиляция. Только линковка.но это та же перекомпиляция, только минимизированная. Надо выгружать приложение, запускать мейк... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 17:58 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmoНе знаю, сработает ли это, вроде бы должно прокатить. Давно уже на сяхпп не писал. Работает. Наверно, это будет самый удобный вариант. Только вопрос. Конструктор этого класса, по времени, как будет по отношению к конструкторам классов, которые будут создаваться статически (во, написал :) )? Раньше, позже или как попало? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 18:19 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
уточни, о каком классе и каких классах ты говоришь (не зря ведь им имена даны :) ). И о каком статическом создании идёт речь? Для строгости стоит напомнить, что классы создаются на стадии компиляции, а глобальные и статические объекты этих классов - на стадии загрузки приложения междй инициализацией кучи и вызовом мейна. Называется это, кажется, global_ctors (на стадии выгрузки, соотв. dtors). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 11:24 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Допустим, есть класс ClassMain, который пользует список, формируемый AddToList. И программисту вздумалось создать экземпляр этого класса статически, в конструкторе которого указана строка с названием класса, которого тот должен создать. Соответственно, перед функцией мэйн, будет вызван конструктор, который побежит по списку и будет искать нужный класс. Так же перед функцией мэйн будут созданы классы ClassXReger, которые будут заполнять этот список. Соответственно вопрос - будет ли в этом случае вовремя заполнен список классов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 12:03 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
гарантии нет (придётся проводить инициализацию ClassMain в две ступени). Возможно, это можно сделать с помощью каких-нибудь прагм (сказать компилятору, чтобы регеры были инициализированы как можно раньше). Возможно даже, порядок инициализации зависит от того, в каком порядке ты указывал библиотеки при линковке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 13:08 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Это плохо. Может каким-то образом средствами С++ можно запретить статическое создание экземпляра? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 13:14 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
сомневаюсь. Опять же можешь посмотреть в прагмы или ещё куда. Но ведь приложение пишешь ты, в чём запарка? Если не найдёшь способа поместить кторы регеров в начало списка кторов, пиши подстраховку. Выдавай ошибку в случае статического создания. Или ещё что придумай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 13:23 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
1. Библиотеки пишу я. Приложения будут разные и те только я их буду писать. 2. А как выдать ошибку в случае статического создания (я это и хотел узнать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 13:42 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
типа так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 14:32 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
где надо, дописываешь "РУКАМИ НЕ ТРОГАТЬ!!!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 14:33 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Гениально! :) Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 18:11 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Ой, как все закрутилось! Можно я прокомментирую? Действительно нет никакой гарантии, что статические объекты в вашем случае будут созданы в правильном порядке (наш любимый С ++ гарантирует порядок создания статических объектов только в пределах единицы компиляции). Задачку, однако, решить можно, но не просто, и без разделяемых библиотек никуда. Сам не пробовал, знаю откуда можно попробовать выдрать – это АСЕ. Есть там такой ServiceConfigurator. Идея довольно простая: делаем разделяемую библиотеку в которую складываем функции с С связыванием (описанные как extern C) каждая из которых создает объекты одного класса, который нужно создавать. Иначе сойдешь с ума с приавилами поименования своего компилятора. Делаем текстовый (xml) файл с описанием связывающий имя класса, имя разделяемой библиотеки и имя фукции. Пишем фабрику, которая в своем конструкторе читает файл описания и создает ассоциативный контейнер. Осталось только сделать из этого класса синглетон. Только такой, чтобы вовремя создавался и разрушался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 20:48 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Дорогой Akh! Спешу обрадовать, был не прав. Сделал как ты хотел. враги полтзователи библиотек даже static смогут юзать. см attachment ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2006, 22:59 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Довел до конца. Теперь и в runtime можно добавлять элементы к фабрике ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 13:26 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedДовел до конца. Теперь и в runtime можно добавлять элементы к фабрике Не подойдет. Т.к., если мне будет необходимо подключить несколько модулей к программе, то у меня будет несколько конструкторов фабрики. Использовать один конструктор неполучится, т.к. в этом случае он будет находиться внутри основного модуля (который будет юзать нужные ему классы). Но он не знает о нужных ему классах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 13:09 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
ты это осилил? Герой. По-моему, это были чисто стихи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 16:12 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmoты это осилил? Герой. По-моему, это были чисто стихи. Нечего подначивать. На самом деле, подошло время реализовывать требуемую возможность (модули теперь готовы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 16:27 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmo Да, кстати, вариант с MainCalled не так уж и хорош. Ставить этот флаг при запуске мэна, не очень хороший стиль. Может С++ сам ставить какой-нибудь флаг? Сейчас вижу только один вариант - в основом уровне необходимо будет использовать метод связки его с нужным нижним уровнем. В конструкторе эта возможность будет недоступна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 16:34 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhДа, кстати, вариант с MainCalled не так уж и хорош. Ставить этот флаг при запуске мэна, не очень хороший стиль.а по-моему, очень даже неплохой костыль. К тому же я предлагал разбить инициализацию на два шага. AkhМожет С++ сам ставить какой-нибудь флаг?ересь. Мейн для него - такой же метод, как и все остальные. Загляни в crt1.c, может, что и нароешь... или нет... там это как-то по-другому называется, уже не помню, смотри в скрипты линкера, там эти объектники приводятся как crt_start.o и crt_end.o... как-то так, потом смотри, из чего эти объектники компилились. Но очень сомневаюсь... хотя... можно попытаться дотянуться до потрохов массива global_ctors (и посмотреть, все ли конструкторы вызваны). Не думаю, что это будет просто. К тому же это будет баааальшой и ужасный хак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 16:52 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmoересь. Мейн для него - такой же метод, как и все остальные. Т.е. для С++ нет понятия старта программы? Или считается, что старт программы начинается с создания статических объектов? maXmoЗагляни в crt1.c, может, что и нароешь... или нет... там это как-то по-другому называется, уже не помню, смотри в скрипты линкера, там эти объектники приводятся как crt_start.o и crt_end.o... как-то так, потом смотри, из чего эти объектники компилились. Но очень сомневаюсь... хотя... можно попытаться дотянуться до потрохов массива global_ctors (и посмотреть, все ли конструкторы вызваны). Не думаю, что это будет просто. К тому же это будет баааальшой и ужасный хак. Уж лучше вы к нам (с) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 17:11 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
А разбиение инициализации на два шага - тоже не очень красиво. Это тоже костыль. MainCalled у меня предназначен только для предотвращения статического создания объектов. То есть это подстраховка на стадии запуска, а не в процессе работы. Ты, я так смотрю, хочешь сделать подстраховку в рантайме, то есть когда статически создаваемый объект делает вид, что всё хорошо, когда на самом деле всё плохо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 17:15 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmoА разбиение инициализации на два шага - тоже не очень красиво. Это тоже костыль. MainCalled у меня предназначен только для предотвращения статического создания объектов. То есть это подстраховка на стадии запуска, а не в процессе работы. Ты, я так смотрю, хочешь сделать подстраховку в рантайме, то есть когда статически создаваемый объект делает вид, что всё хорошо, когда на самом деле всё плохо? Как раз наоборот. Я хочу разругаться, что объект создан статически и отказываться продолжать дальше работать. Такая ошибка будет выявляться сразу же на стадии разработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 17:19 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhТ.е. для С++ нет понятия старта программы? Или считается, что старт программы начинается с создания статических объектов?Ну, входная точка в код девелопера - это функция мейн. Создание статических объектов, инициализация кучи, разбор параметров командной строки, регистрация дефолтных обработчиков сигналов - это так, подготовка рабочей среды. Ты фактически вылезаешь из девелоперского кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 17:21 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhЯ хочу разругаться, что объект создан статически и отказываться продолжать дальше работать. Такая ошибка будет выявляться сразу же на стадии разработки.а... тогда я что-то не понял, что ты там про уровни говорил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 17:22 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmoНу, входная точка в код девелопера - это функция мейн. Создание статических объектов, инициализация кучи, разбор параметров командной строки, регистрация дефолтных обработчиков сигналов - это так, подготовка рабочей среды. Ты фактически вылезаешь из девелоперского кода. Значит С++ дает средства для выполнения конструктора в из девелоперского кода и перед ним, но не дает средств для определения в каком коде происходит выполнение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 17:28 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmo AkhЯ хочу разругаться, что объект создан статически и отказываться продолжать дальше работать. Такая ошибка будет выявляться сразу же на стадии разработки.а... тогда я что-то не понял, что ты там про уровни говорил. Есть нижние уровни (допустим 1), есть верхние (допустим 2, 3...). Как стек tcp/ip. Вместо нижних, можно подставлять разные: на ком порту, на езернете, на виртуальном ком порте (с уже некоторой функциональностью). Уровень 3 говорит второму - работай с этим 1-м. При добавляении новых уровней 1 (реализована возможность работать с другой железкой) уровень 2 не должен перекомпилироваться. Все это в библиотеках Пишется приложение, к которому подлинковываются нужные либы. Приложение через уровни вниз, говорит на каком уровне 1 оно должно работать. В процессе работы возможен переход на другой уровень 1. Не помешало бы добавить возможность выбора уровня 1 в конструкторах высших над ним уровнях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 17:37 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhЗначит С++ дает средства для выполнения конструктора в из девелоперского кода и перед ним, но не дает средств для определения в каком коде происходит выполнение?ну девелоперский код ты сам пишешь и там как бы всё естественно проходит. Последовательность инициализации статических объектов определяешь не ты. Ну никак это не изменить. У сипп средств для этого нет, вернее, там всё инициализируется в той последовательности, в какой объекты встретились компилеру. В сети есть спецификация ANSI C++ и там весь раздел 3.6.2 - по твоей части. Очень интересно пишут. Читай всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 20:04 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Молодец что прорвался через кодю Только вот главного и не заметил. В main.cpp есть typedef, определяющий MyFactory как Singleton. Если из модулей программы лбращатся к фабрике как static Singleton< Factory<K, T> > myFactory; myFactory->make(...); то Singleton гарантирует что будет создана одна копия объекта Factory<K, T> и разрушена она будет когда будут удалены все ссылки на него. Причем даже если вы обратитесь к нему из статически создаваемого обекта. Кстати если ваше приложение многопоточное надо защитить счетчик ссылок мьютексом. А что до вашего диспута, то понять где создается объект на стеке, в куче, или в статической памяти можно, только оно вам надо? Не лучше ли программировать так чтобы этого не требовалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 20:07 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedА что до вашего диспута, то понять где создается объект на стеке, в куче, или в статической памяти можно, только оно вам надо?да это как бы пофиг, но имхо, статические объекты создаются в статической памяти. В стандарте в частности написано, что сначала там нули, а потом на эти нули натравливается конструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 20:15 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blinded, кстати, как-то подозрительно выглядит у тебя добавление хелперов в список. В f1.cpp и f2.cpp у тебя приводится DECLARE_FACTORY(string, Base), это выливается в два объявления Factory<string,Base>::Factory(). По-моему, это не слинкуется. То есть ты не сможешь собрать этот проект со всеми четырьмя классами Child_1, Child_2, Child_3, Child_4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 20:33 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedМолодец что прорвался через кодю Только вот главного и не заметил. В main.cpp есть typedef, определяющий MyFactory как Singleton. Если из модулей программы лбращатся к фабрике как static Singleton< Factory<K, T> > myFactory; myFactory->make(...); то Singleton гарантирует что будет создана одна копия объекта Factory<K, T> и разрушена она будет когда будут удалены все ссылки на него. Причем даже если вы обратитесь к нему из статически создаваемого обекта. Из модулей программы нет смысла обращаться к мэйк, так как эта функция создания объекта, а не добавлсения его в мап. В этом случае надо будет вызывать адд фабрики, и это будет происходить на стадии создания статических вспомогательных классов. Опять же возвращаемся к проблеме статического создания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 10:30 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
maXmoВ сети есть спецификация ANSI C++ и там весь раздел 3.6.2 - по твоей части. Очень интересно пишут. Читай всё. млин, никак найти не могу. где искать может помнишь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 10:34 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedА что до вашего диспута, то понять где создается объект на стеке, в куче, или в статической памяти можно, только оно вам надо? Не лучше ли программировать так чтобы этого не требовалось. Как интересно определить? Пока единственный выход - не давать создовать связи с нижними уровнями в конструкторе верхнего. Надо будет после создания объекта вызывать функцию привязки, что, как недавно тут обсуждалось, не является хорошим стилем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 10:36 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
http://anatolix.naumen.ru/Books/Index там вообще очень занятные книжечки. blinded, сюда же наш любимый ClassMain. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 14:37 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
По-моему есть некоторое непонимание. Дело в том что глобальный static и static внутри модуля есть две большие разницы. Один инициализируется до main, другой при первом входе в модуль. Теперь взгляните на Singleton - это совсем не сам объект - это placeholder для объекта. Сам объект фабрики ежели к нему обращатся через static Singleton < Factory <std::string, Base> > будет создан только один раз. Теперь давайте посмотрим что произойдет, если к фабрике обратятся из конструктора некоторого глобального статического объекта вышеуказанным способом. Будет проинициализирован статический объект Singleton. Singleton посмотрит на счетчик ссылок, он 0 (встроенный тип инициализирован константой все и так ясно на этапе компиляции), и создаст требуемый объект на heap'e, увеличив счетчик ссылок на 1. Важно что синглетон статический, иначе при выходе из модуля для него будет вызван деструктор, счетчик ссылок уменьшится на 1, и фабрика тоже будет разрушена. Но тем не мене, когда вы начнете из коструктора глобального статического объекта обращатся к синглетону фабрики, для фабрики гарантированно вызван конструктор, а сама фабрика расположена на heap'е. Если кто не верит - смотрите attachment(руки мне оторвать за такой main). Теперь что касается Двойной декларации фабрики, да этого сделать нельзя. Но это не есть недостаток, наоборот это преимущество, которое снижает вероятность ошибок ибо все что касается "зарядки фабрики" собрано в одном файле. Файлы f1.cpp f2.cpp сделаны для того чтобы показать как простой перелинковкой изменить поведение приложения. У меня например есть программы которые пишут либо в файл либо в базу данных. Причем различие в только makefile просто ликуются разные фабрики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 14:55 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
ну дык Akh просил доваление класса без перекомпиляции всяких модулей-связок. Так-то с возможностью перекомпиляции вообще можно даже не извращаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 15:25 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedТеперь что касается Двойной декларации фабрики, да этого сделать нельзя. Но это не есть недостаток, наоборот это преимущество, которое снижает вероятность ошибок ибо все что касается "зарядки фабрики" собрано в одном файле. Уже наверное 3-й раз говорю в топике, что у меня может быть несколько модулей, которые должны добавляться к фабрике. Как правельно заметил maXmo, модули должны просто прилинковываться в случае ниобходимости. Компиляция только приложения, дабы программист заморачивался только редакцией его приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 15:36 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedК сообщению приложен файл (fac2_2.zip): cкачать . Размер - 2Kb Все молчал, молчал... вот, все же решил сказать: если будешь еще что-нибудь аттачить, запаковывай, пожалуйста, зипом попроще. Без нескольких проходов. А то у меня gunzip не берет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 15:41 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
у меня 7zip схавал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 15:43 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
AkhКак правельно заметил maXmo, модули должны просто прилинковываться в случае ниобходимости. Компиляция только приложения, дабы программист заморачивался только редакцией его приложения. почитай это если найдешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 15:53 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) AkhКак правельно заметил maXmo, модули должны просто прилинковываться в случае ниобходимости. Компиляция только приложения, дабы программист заморачивался только редакцией его приложения. почитай это если найдешь Я вчера добирался домой, взял пива и мне пришла гениальная мысль - задача, которую я решаю имеет ответ такой - драйверы. Не знаю на сколько эта мысля верна, но взглянув ни линух и форточку у меня сложилось такое впечатление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 16:00 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
почитай, книжка про это. я не поклонник подобных извращений но почитать стоит (стоит даже купить) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 16:21 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Akh blindedТеперь что касается Двойной декларации фабрики, да этого сделать нельзя. Но это не есть недостаток, наоборот это преимущество, которое снижает вероятность ошибок ибо все что касается "зарядки фабрики" собрано в одном файле. Уже наверное 3-й раз говорю в топике, что у меня может быть несколько модулей, которые должны добавляться к фабрике. Как правельно заметил maXmo, модули должны просто прилинковываться в случае ниобходимости. Компиляция только приложения, дабы программист заморачивался только редакцией его приложения. Что-то я не пойму. Ты что пишешь набор библиотек и хочешь чтобы в зависимости от того какие библиотеки пользователь прилинковал такие классы в фабрике и оказались. Да еще чтобы фабрика была сформирована до того как ею попытаются воспользоваться из глобального статического объекта? Ну тонда ОЙ! Не знаю как это сделать и вряд-ли тебе кто поможет. Можно только скриптик накатать, который будет генерить cpp файл Задачка имеет решение либо если бибилиотека одна (всю инициализацию в один модуль), либо если не заморачиваться с глобальными static ( в доку warning) Извините за мой zip. Вот кому интересно. Присто я под cygwin сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 17:19 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedЧто-то я не пойму. Ты что пишешь набор библиотек и хочешь чтобы в зависимости от того какие библиотеки пользователь прилинковал такие классы в фабрике и оказались. Да еще чтобы фабрика была сформирована до того как ею попытаются воспользоваться из глобального статического объекта? Ну тонда ОЙ! Не знаю как это сделать и вряд-ли тебе кто поможет. Можно только скриптик накатать, который будет генерить cpp файл Задачка имеет решение либо если бибилиотека одна (всю инициализацию в один модуль), либо если не заморачиваться с глобальными static ( в доку warning) Извините за мой zip. Вот кому интересно. Присто я под cygwin сейчас. Надо, все-таки внимательно читать топик. Значит, отвечаю по порядку: 1.да 2.нет. я хочу запретить создание объекта статически, который пользуется фабрикой. Т.е. конструктор объекта понимает, что его объект создается статически и говорит "Ой! segmentation fail" например. Лучше, конечно, чтобы он сказал что-нибудь члено раздельное, главное, чтобы он мог понять что-творится. Уже мона и зипом, скачал p7zip (спасибо maXmo) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 17:30 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Придумал! Идея простая - запретить добавление к фабрике, после первого вызова метода make хоччешь сделаю и падать будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 17:39 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedПридумал! Идея простая - запретить добавление к фабрике, после первого вызова метода make хоччешь сделаю и падать будет? Не пойдет. Девелопер будет разрабатывать разрабатывать, все может быть будет работать нормально. Потом сделает реалайз уверенный что код написан отлично и сто раз проверен, перелинкует задом к жопе и не проверит. Приложение в последний момент может оказаться неработоспособным, хотя все было хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 17:55 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Конечно это не то что вам хочется, но вме же. Кроме того рапишите ОГРОМНЫМИ БУКВАМИ В ДОКЕ и тогда это уже не ваша вина. А написать абсолютно надежные компоненты просто нельзя, всегда найдется хакер. я за 17 лет таких уродов повидал... вот а в примере а1 -нормальный код и работает, а2 - код запрещенный, но работает (повезло), а а3 - тотже а2 но по-другому слинкованный (ну не повезло)ю Кстати чем больше проет, тем выше вероятность что не повезетю PS Наезд по-поводу топика не принимаю, в нем ну ни слова о вашей задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 19:48 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Черт! забыл файло приложить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 19:50 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedPS Наезд по-поводу топика не принимаю, в нем ну ни слова о вашей задаче. Вломак рыться по всему топику, вот, первое что попало на 3-й странице: см п.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 09:38 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedКонечно это не то что вам хочется, но вме же. Кроме того рапишите ОГРОМНЫМИ БУКВАМИ В ДОКЕ и тогда это уже не ваша вина. А написать абсолютно надежные компоненты просто нельзя, всегда найдется хакер. Расписать огромными буквами, это конечно же. Но их можно прочитать и забыть (я так частенько делаю :) ), а вот если программа сама будет говорить: "ну что же ты делаешь, подлец!", то это другое дело. ПО, должно само за себя отвечать. Я беру расчет на нормальных программистов, которые должны будут заботиться о своем приложении. Если они будут извращаться над тем, что трогать не надо, это уже их проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 09:42 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
blindedа2 - код запрещенный, но работает (повезло) у меня, кстати, не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 09:46 |
|
||
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#18+
Значит тебе не повезло с а2. Тем не менее можно подвести черту под дискуссией: Захотелось нам изначально странного, а именно размазать конструктор класса (фабрики) по нескольким модулям. Пользуясь тем что наш класс - Singleton и пользуясь особенностями инициализации глобальных статических переменных нам это удалось, только вот из-за неопрделенного порядка инициализации этих самых глобальных статических переменных мы не смогли гарантировать завершение конструирования фабрики до ее использования в процессе построения других глобальных статических объектов. С этим уже ничего не поделать. Можно только написать документацию. убедить потребителей не использовать глобальные статические объекты, а юзать выше упомянутый Singleton. Ну а если библиотек будет всего 2-3 то монжно пойти на ломовой способ - написать 3 или 7 объектников реализующих конструктор фабрики (см предпоследнюю версию) А чтобы не ошибится в каждой бибилиотеке иметь функцию. добавляющую классы размещенные в библиотеке к фабрике. а в реализации конструкторов дергать нужные функции. И так и поставлять 3 библиотеки и 7 отдельных объектников А здорово развлеклись... Еще такой вопрос хочу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 20:53 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2030780]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
132ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 535ms |

| 0 / 0 |
