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

start [/forum/moderation_log.php?user_name=%D0%9C%D1%8F%D1%84]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 715ms |
| total: | 919ms |

| 0 / 0 |
