|
|
|
динамическое создание объекта, тип которого указан в виде строки.
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=342&tid=2030780]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 291ms |

| 0 / 0 |
