powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамическое создание объекта, тип которого указан в виде строки.
96 сообщений из 96, показаны все 4 страниц
динамическое создание объекта, тип которого указан в виде строки.
    #33848076
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как реализовать сабж? Это возможно?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848142
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhКак реализовать сабж? Это возможно?

Первое что пришло в голову
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class BaseClass {};
class Class1: public BaseClass{};
class Class2: public BaseClass{};
class Class3: public BaseClass{};

BaseClass* create(const char* className)
{
    if(strcmp(className, "Class1") ==  0 )
        return new Class1();
    if(strcmp(className, "Class2") ==  0 )
        return new Class2();
    if(strcmp(className, "Class3") ==  0 )
        return new Class3();
    fprintf(stderr, "unknown class\n");
    return NULL;  //или throw
}
Может есть более интересные способы?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848167
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структура классов точно такая, как ты написал.

Но предполагается, что я не знаю какие классы у меня будут. Эти классы (в библиотеках) будут слинкованы вместе с программой. А название класса будет в виде строки передоваться в конструктор другого класса (он понятия не имеет о возможных вариантах), который будет создавать требуемый класс и пользовать его.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848170
ZeusTheTrueGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде бы таких вещей надо избегать в с++. Интересно узнать, зачем понадобилось такое извращение?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848204
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeusTheTrueGodвроде бы таких вещей надо избегать в с++. Интересно узнать, зачем понадобилось такое извращение?

Эти все классы являются некоторыми уровнями. Данные по ним бегут туда сюда. Но, всявязи с тем, что железки бывают разными (ком порты, езернет, всякая специализация), надо иметь возможность гибко подменять уровни. Т.е. я линкую нужные мне библиотеки, и уровню 2 говорю: будешь пользовать вот этот класс как уровень 1. Таким образом можно избежать модификацию библиотеки уровня 2, в тех случаях, когда появляются новые уровни 1.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848234
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhСтруктура классов точно такая, как ты написал.

Но предполагается, что я не знаю какие классы у меня будут. Эти классы (в библиотеках) будут слинкованы вместе с программой. А название класса будет в виде строки передоваться в конструктор другого класса (он понятия не имеет о возможных вариантах), который будет создавать требуемый класс и пользовать его.

Не знаю, я сильно сомневаюсь в том что обычными средствамя С++ можно создать объект, тип которого не известен при компиляции.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848266
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KНе знаю, я сильно сомневаюсь в том что обычными средствамя С++ можно создать объект, тип которого не известен при компиляции.

Я тоже не уверен, но во всяком случае в исполняемом файле есть его имя (но, понаятно, что это еще ни о чем не говорит, просто как мысля).
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848285
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh ZeusTheTrueGodвроде бы таких вещей надо избегать в с++. Интересно узнать, зачем понадобилось такое извращение?

Эти все классы являются некоторыми уровнями. Данные по ним бегут туда сюда. Но, всявязи с тем, что железки бывают разными (ком порты, езернет, всякая специализация), надо иметь возможность гибко подменять уровни. Т.е. я линкую нужные мне библиотеки, и уровню 2 говорю: будешь пользовать вот этот класс как уровень 1. Таким образом можно избежать модификацию библиотеки уровня 2, в тех случаях, когда появляются новые уровни 1.

Я не совсем все понял, но помоему тут можно сделать так чтоб в каждой библиотеке была функция типа:
Код: plaintext
1.
2.
3.
4.
BaseClass* Create() 
{
    return new Class1();
}
О базовом классе знает вся прога, о конкретном только библиотека, прога вызывает эту функцию у библиотеки. Если ты решишь сменить библиотеку, то в ней должна быть такая же функция. Хотя могут возникнуть ошибки если тебе надо будет подключить сразу несколько таких библиотек.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848377
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KЯ не совсем все понял, но помоему тут можно сделать так чтоб в каждой библиотеке была функция типа:
Код: plaintext
1.
2.
3.
4.
BaseClass* Create() 
{
    return new Class1();
}
О базовом классе знает вся прога, о конкретном только библиотека, прога вызывает эту функцию у библиотеки. Если ты решишь сменить библиотеку, то в ней должна быть такая же функция. Хотя могут возникнуть ошибки если тебе надо будет подключить сразу несколько таких библиотек.

К сожалению такой вариант не пройдет, т.к. может быть подключено быть несколько библиотек (например, в горячую перейти на другой тип уровня 1).
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848413
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhКак реализовать сабж? Это возможно?

Рекомендую глянуть книгу Джэфа Элджера.
подзаголовок - библиотека программиста..а название "C++"
в инете сможете найти в электронном виде. Обложка мягкого, маленького формата, чёрный фон.

там найдёте и "виртуальные" конструкторы и альтернативу всяким ифам-свитчам и многое ышо интересных мыслей (грани, мудрые указатели, кристаллы). Так же затрагивалась и Ваша тема.

Если по вопросу...
То...
Вам предложили вариант с базовым классом. В принцепе этого достаточно (ну почти) чтоб решить Ваши проблемы. Сюда добавить механизацию от Элджера в ввиде "двойной передачи" данных и мне так икается - получите то чего хотели. Но тут правильно заметили - одна из сильных сторон си плас пласа - типизация.

с уважением
(круглый)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848505
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
Рекомендую глянуть книгу Джэфа Элджера.
подзаголовок - библиотека программиста..а название "C++"
в инете сможете найти в электронном виде. Обложка мягкого, маленького формата, чёрный фон.

там найдёте и "виртуальные" конструкторы и альтернативу всяким ифам-свитчам и многое ышо интересных мыслей (грани, мудрые указатели, кристаллы). Так же затрагивалась и Ваша тема.

Если по вопросу...
То...
Вам предложили вариант с базовым классом. В принцепе этого достаточно (ну почти) чтоб решить Ваши проблемы. Сюда добавить механизацию от Элджера в ввиде "двойной передачи" данных и мне так икается - получите то чего хотели. Но тут правильно заметили - одна из сильных сторон си плас пласа - типизация.

с уважением
(круглый)

За совет спасибо - встретится посмотрю.
Если будут предложены варианты без потери типизации буду только рад.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848655
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhЕсли будут предложены варианты без потери типизации буду только рад.

кстати посомтрите в сторону COMа. Именно такие задачи он и решает с успехом. Вы получаете интерфейс и далее работаете с ним. Вокруг интерфейса обычно строиться врапер. С точки зрения Вашей логики (юзанья уровней) - Вам не нужен явный класс как таковой, Вам важнее тот функционал который Вы будете использовать на данном уровне. Значит напрашиваются классы отображающие не объекты взаимодействия, а ту часть объекта функционал которой Вам нужен для конкретного действия.

Например...(в терминах Джэфа Элджера)...
Вам нужно ампутировать "голову" у некой сущнсоти...
Есть непонятно что...(ссылка на нечто - не важно)..
создаём класс голова и как входные параметры передаём ссылку на "нечто".
Далее нам нужно узнать - голова ты ликвидна ?
И если ответ положительный - ампутируем...

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


с уважением
(круглый)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848729
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0кстати посомтрите в сторону COMа.
...
Вам нужно ампутировать "голову" у некой сущнсоти...
...


Не думал, что в такие дебри заведет данный вопрос. Всвязи с этим надо уточнить, что проект под Линукс.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848764
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhНе думал, что в такие дебри заведет данный вопрос. Всвязи с этим надо уточнить, что проект под Линукс.

а при чём тут Линукс (Вас COM возбудил ? :) ) ? Да хоть Novell. COM - методология. Или Вы утверждаете что методология зависит от платформы ? Тогда ышо рекомендую прочитать книжку "Основы COM". Особенно первые главы - там где говориться, что это такое.

с уважением
(круглый)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33848856
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 AkhНе думал, что в такие дебри заведет данный вопрос. Всвязи с этим надо уточнить, что проект под Линукс.

а при чём тут Линукс (Вас COM возбудил ? :) ) ? Да хоть Novell. COM - методология. Или Вы утверждаете что методология зависит от платформы ? Тогда ышо рекомендую прочитать книжку "Основы COM". Особенно первые главы - там где говориться, что это такое.


С комом знаком поскольку-постольку в виндах. Использовал только один раз и то по примерам, поэтому счел нужным уточнить платформу.

Вряд ли я буду изучать ком только из-за этого. Может я и ошибаюсь, но решение с помощью вышеописанной методики мне кажется черезчур громоздким.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33849203
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам СОМ только изучаю и пока написал только один мало мальски достойный проэкт. Но вся идея заклюяаеться в том что у тебя есть указатель на интерфейс (Элджер это называет гранью), т.е. например
Код: plaintext
1.
2.
3.
class IWorkInterface{
  void DoSomthing()= 0 ;
  void Relise()= 0 ;
};
Классы реализующие этот интерфейс соот.
Код: plaintext
1.
class Class1: public IWorkInterface{...};
class Class2: public IWorkInterface{...};
Далее в программе ты запрашиваешь нужную реализацию ИНТУРФЕЙСА
Код: plaintext
1.
2.
3.
IWorkInterface *pW;
pW = GetMeWorkInterface(ClassDesc);
pW->DoSomthing();
pW->Relise();
ClassDesc - это нечто что может быть интерпретированно тобой.
Например имя библиотеки DLL и имя класса.
Библиотека загружаеться динамически и у нее запрашиваеться нужная реализация интерфейса.
В этом случаи необходимо обеспечить только чтобы библиотека экспортировала нужную ф.(хотя и ее можно считывать динамически), ну и чтобы библиотека знала по именам все классы принадлежащие только ЕЙ.

СОМ в принципе этим и занимаеться. Есть идентификатор класса который запрашиваеться. Далее у этого класса запрашиваеться интерфейс. Сам объект может распологаться при этом где угодно в сети и обслуживать сколько угодно клиентов. Но если тебе это не надо то можно наверное и сделать нечто самому.
На счет поддержки Линуксом КОМ я точно не скажу, но вроде должен поддерживаться.

ЗЫ. На счет книжек. Мне очень понравился Дональд Бокс. "Сущность технологии COM.".
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33849384
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteus
Далее в программе ты запрашиваешь нужную реализацию ИНТУРФЕЙСА
Код: plaintext
1.
2.
3.
IWorkInterface *pW;
pW = GetMeWorkInterface(ClassDesc);
pW->DoSomthing();
pW->Relise();
ClassDesc - это нечто что может быть интерпретированно тобой.
Например имя библиотеки DLL и имя класса.


Я с COM никогда не работал.
Мне вот интересно как функция GetMeWorkInterface(ClassDesc); реализуется?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33849536
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteusЗЫ. На счет книжек. Мне очень понравился Дональд Бокс. "Сущность технологии COM.".

the best.

Sandro_K, любой объект ком знает какие интерфейсы он может предоставить. Если ты его просишь предоставить другой интерфейс - он не сделает это.
Для твоего случая - есть группы COM объектов, для которых можно выполнить функцию "Дать мне CLSID всех комобъектов группы", а потом у какого хочешь можешь попробовать взять интерфейс.


На самом деле есть еще и CORBA, которая таки работает под Linux:)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33849891
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteusСам СОМ только изучаю и пока написал только один мало мальски достойный проэкт. Но вся идея заклюяаеться в том что у тебя есть указатель на интерфейс (Элджер это называет гранью), т.е. например
Код: plaintext
1.
2.
3.
class IWorkInterface{
  void DoSomthing()= 0 ;
  void Relise()= 0 ;
};
Классы реализующие этот интерфейс соот.
Код: plaintext
1.
class Class1: public IWorkInterface{...};
class Class2: public IWorkInterface{...};
Далее в программе ты запрашиваешь нужную реализацию ИНТУРФЕЙСА
Код: plaintext
1.
2.
3.
IWorkInterface *pW;
pW = GetMeWorkInterface(ClassDesc);
pW->DoSomthing();
pW->Relise();
ClassDesc - это нечто что может быть интерпретированно тобой.
Например имя библиотеки DLL и имя класса.
Библиотека загружаеться динамически и у нее запрашиваеться нужная реализация интерфейса.
В этом случаи необходимо обеспечить только чтобы библиотека экспортировала нужную ф.(хотя и ее можно считывать динамически), ну и чтобы библиотека знала по именам все классы принадлежащие только ЕЙ.

О это страшное слово СОМ! :) Шутка

Прочитал 2 раза, но не понял: в чем здесь приемущества по сравнению с вариантом, который предложил Sandro_K в самом начале топика?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33851321
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что я написал есть первое приближение к СОМ.
AkhПрочитал 2 раза, но не понял: в чем здесь приемущества по сравнению с вариантом, который предложил Sandro_K в самом начале топика?
Принцип тот же.
Я просто хотел показать что имена классов не обязательно должны быть известны на момент компиляции.
Я незнаю линукс. Для винодовс можно реализовать по принципу.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
IWorkIntarface* GetMeWorkInterface(const TClassDescriptor& ClassDesc){
  HMODULE hLib;
  IWorkIntarface *pWI =  0 ;
  hLib = LoadLibrary(DescClass.DllName);
  (FARPROC &)pGetWI = GetProcAddress(hLib, "GetWorkObject");
  pWI = pGetWI(ClassDesc.ClassName);
//? Вроде объекты из кучи не должны уничтожиться при выгрузке
  FreeLibrary(hLib);
  return pWI
} 

Создаешь отдельную ДЛЛ в которой реализуешь класс TIthernet. и ф. GetWorkObject которая принимая строку("ClassIthernet") возвращает указатель типа IWorkIntarface.
Далее напр. в INI пишешь
[CLASS_22]
DLL="Ithernet.dll"
CLSID="ClassIthernet"

и все.
При этом не надо ни переписывать ни перекомпилировать вызывающую программу.
Сразу предупреждаю что это чисто теоретические рассуждения. Пускай более опытные коллеги подправят если что.

Удачи.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33851457
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteus
//? Вроде объекты из кучи не должны уничтожиться при выгрузке

Объекты наверно не уничтожатся, но методы этих классов скорее всего реализованы будут внутри библиотеки, так что FreeLibrary(hLib); надо наверно вызывать только когда уничтожаться будет объект, хотя я в этом не разбираюсь.
В линуксе что-то подобное можно сделать, это точно. У нас на работе один чел что-то похожее пытался сделать, но у него возникли какие-то проблемы, и это так и не было доделано.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33851562
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен.
Надо чтоб при удалении последнего объекта библиотека сама выгружалась.
Это уже совсем СОМ получаеться :).
Но это не так все и реализовать если есть всего один клиент.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33851700
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteusТо что я написал есть первое приближение к СОМ.

Т.е. тот же вариант (усложненный), но реализованный в виде отдельной библиотеки, которую надо будет перекомпилять.

Не хочется городить из мухи слона (плодить модули), если программа сама сможет определить адрес, то создавать новый модуль (связки) не рационально.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33852690
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh, вам нужно автоматизировать построение списка пар "Имя класса"->"Указатель на функцию, возвращающую экземпляр класса" ?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33853055
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneAkh, вам нужно автоматизировать построение списка пар "Имя класса"->"Указатель на функцию, возвращающую экземпляр класса" ?

Что-то вроде этого...
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33853666
MElin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh BarloneAkh, вам нужно автоматизировать построение списка пар "Имя класса"->"Указатель на функцию, возвращающую экземпляр класса" ?

Что-то вроде этого...
макрос DECLARE_DYNCREATE делает примерно тоже самое.
после определения этого макроса внутри класса (потомка Object) возможно создание его создание в рантайм
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33853716
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MElinмакрос DECLARE_DYNCREATE делает примерно тоже самое.
после определения этого макроса внутри класса (потомка Object) возможно создание его создание в рантайм

Внял совету, почитал

А мне его взять то, если я на gcc?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33853771
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh MElinмакрос DECLARE_DYNCREATE делает примерно тоже самое.
после определения этого макроса внутри класса (потомка Object) возможно создание его создание в рантайм

Внял совету, почитал

А мне его взять то, если я на gcc?
Так то ж MFC ))

Но полезно будет почитать про RTTI от Borland и CRuntimeClass и иже с ним от Microsoft, принципы, реализация... чтоб своё наваять или может под gcc что-то подобное найдёшь.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33853935
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял по afx.h в имплемент имя класса передается не в виде строки. Так, что это не то что нужно.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33854484
a_shar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhА мне его взять то, если я на gcc?
Можешь заюзать Qt, там есть такая возможность, смотри QMetaType у него есть метод construct.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33854612
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_sharМожешь заюзать Qt, там есть такая возможность, смотри QMetaType у него есть метод construct.

Там имя класса передается в виде строки?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33855566
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача решается в полсотни строк, причем достаточно элегантно. Идея достаточно проста: заводится статический ассоциативный контейнер, в который в момент загрузки программы заносятся объекты, способные создавать прикладные объекты соответствующего класса. М-да непонятно получилось, лучше посмотреть на код. Там все гораздо понятнее. Могу прислать готовый заголовочный файл с тестовым случаем. Писать 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
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33855615
a_shar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_shar AkhА мне его взять то, если я на gcc?
Можешь заюзать Qt, там есть такая возможность, смотри QMetaType у него есть метод construct.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    int id = QMetaType::type("MyClass");
    if (id !=  0 ) {
        void *myClassPtr = QMetaType::construct(id);
        ...
        QMetaType::destroy(id, myClassPtr);
        myClassPtr =  0 ;
    }

в объявление класса вставь
Код: plaintext
1.
2.
    int id = qMetaTypeId<QString>(); // id is now QMetaType::QString
    id = qMetaTypeId<MyStruct>(); // compile error if MyStruct not declared
думаю из примера понятно что куда
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33855908
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_shar a_shar AkhА мне его взять то, если я на gcc?
Можешь заюзать Qt, там есть такая возможность, смотри QMetaType у него есть метод construct.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    int id = QMetaType::type("MyClass");
    if (id !=  0 ) {
        void *myClassPtr = QMetaType::construct(id);
        ...
        QMetaType::destroy(id, myClassPtr);
        myClassPtr =  0 ;
    }

в объявление класса вставь
Код: plaintext
1.
2.
    int id = qMetaTypeId<QString>(); // id is now QMetaType::QString
    id = qMetaTypeId<MyStruct>(); // compile error if MyStruct not declared
думаю из примера понятно что куда
У Qt две беды
1 необхобимость тащить ее с собой, что не всегда оправдано. Например демона написать.
2 возвращает такая фабрика void*. Эта беда пострашнее. Дело в том, что родитель в наследнике может размещаться совсем не 0 смещением. Например в случае множественного наследования. И как в таком случае приводить тип?
PS На attachment тестовый пример повесил
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33857139
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedЗадача решается в полсотни строк, причем достаточно элегантно. Идея достаточно проста: заводится статический ассоциативный контейнер, в который в момент загрузки программы заносятся объекты, способные создавать прикладные объекты соответствующего класса. М-да непонятно получилось, лучше посмотреть на код. Там все гораздо понятнее. Могу прислать готовый заголовочный файл с тестовым случаем. Писать vaska@b-k.ru
...


Решение, действительно красивое. Разбираюсь.

Не могу понять почему:
Код: plaintext
1.
2.
3.
4.
5.
6.
g++ -c main.cpp -o main.o
g++ -c f1.cpp -o f1.o
g++ -c f2.cpp -o f2.o
g++ main.o f1.o f2.o -o main
f2.o(.bss+0x0): multiple definition of `Factory<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Base>::buf'
f1.o(.bss+0x0): first defined here

По всей видимости, компилятор не удиляет внимания наймспейсу из DECLARE_FACTORY?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33858939
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не пытайтесь слинковать две фабкики с одинаковыми параметрами в один исполняемый модуль. Ну ничего не выйдет. Она объявлена все какаого либо namespace. А безымянный namespace в макросах заведен typedef внутри него не пересеклись с кем-нибудь. Рад что понравилосьЖ)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33861421
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Средствами C++ (самого языка) вам это не сделать. Таких средств нет.
Надо писать . Это называвется Class Factory, это pattern такой, описано в GoF и еще в других источниках. Читайте.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33864164
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivСредствами C++ (самого языка) вам это не сделать. Таких средств нет.
Надо писать . Это называвется Class Factory, это pattern такой, описано в GoF и еще в других источниках. Читайте.
Хотоший совет. Вот только у Банды 4-х как раз switch и нарисован. Лучше почитать Александреску Modern C++ Design ... Там целая глава по этому поводу. А еще интересная фабрика у Дага Шмидта Network Programming using C++ vol 2
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33864407
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KВ линуксе что-то подобное можно сделать, это точно. У нас на работе один чел что-то похожее пытался сделать, но у него возникли какие-то проблемы, и это так и не было доделано.угу, мне сказали, в лине нет дллок, есть разделяемые библиотеки, но они грузятся только при загрузке приложения. Akh, я так понял, ты подгружаешь библиотеку в рантайме. Расскажи, как. Интересно.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33864754
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoугу, мне сказали, в лине нет дллок, есть разделяемые библиотеки, но они грузятся только при загрузке приложения. Akh, я так понял, ты подгружаешь библиотеку в рантайме. Расскажи, как. Интересно.

Я использую статичесткие, т.к. в данном проекте нет смысла использовать разделяемые.

Если интересна эта тема, можно посмотреть например тут .
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33864798
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эээ... и как ты собираешься с помощью статических библиотек добавлять новый класс без перекомпиляции?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33864817
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoэээ... и как ты собираешься с помощью статических библиотек добавлять новый класс без перекомпиляции?

[...наивный взгляд...] как blinded объяснял. Мне не нужна перекомпиляция. Только линковка.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33864843
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компиляция только самого приложения и линковка с библиотеками. да бы не перекомпиливать библиотеки
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33864942
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh BarloneAkh, вам нужно автоматизировать построение списка пар "Имя класса"->"Указатель на функцию, возвращающую экземпляр класса" ?Что-то вроде этого...если юзать лишь статические бибки, могу предложить такое...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
extern int AddToList(char*,IWorkInterface *(*)());

class Class3 : public IWorkInterface
{
 public:
 static IWorkInterface *CreateInstance();
 ...
}

class Class3Reger
{
 public:
 Class3Reger()
 {
  AddToList("Class3",Class3::CreateInstance);
 }
} Class3StartupReger;
функция AddToList одна, строит где-нибудь у себя ассоциативный массив адресов функций. Потом из этого массива можно будет вызвать нужный CreateInstance по имени класса. Объявление Class3StartupReger должно будет вызвать выполнение своего конструктора при загрузке приложения (типа статического кода в джаве). Не знаю, сработает ли это, вроде бы должно прокатить. Давно уже на сяхпп не писал.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33864987
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhМне не нужна перекомпиляция. Только линковка.но это та же перекомпиляция, только минимизированная. Надо выгружать приложение, запускать мейк...
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33865082
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoНе знаю, сработает ли это, вроде бы должно прокатить. Давно уже на сяхпп не писал.

Работает. Наверно, это будет самый удобный вариант.

Только вопрос. Конструктор этого класса, по времени, как будет по отношению к конструкторам классов, которые будут создаваться статически (во, написал :) )? Раньше, позже или как попало?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33866265
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уточни, о каком классе и каких классах ты говоришь (не зря ведь им имена даны :) ). И о каком статическом создании идёт речь? Для строгости стоит напомнить, что классы создаются на стадии компиляции, а глобальные и статические объекты этих классов - на стадии загрузки приложения междй инициализацией кучи и вызовом мейна. Называется это, кажется, global_ctors (на стадии выгрузки, соотв. dtors).
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33866447
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, есть класс ClassMain, который пользует список, формируемый AddToList. И программисту вздумалось создать экземпляр этого класса статически, в конструкторе которого указана строка с названием класса, которого тот должен создать. Соответственно, перед функцией мэйн, будет вызван конструктор, который побежит по списку и будет искать нужный класс. Так же перед функцией мэйн будут созданы классы ClassXReger, которые будут заполнять этот список. Соответственно вопрос - будет ли в этом случае вовремя заполнен список классов?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33866842
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гарантии нет (придётся проводить инициализацию ClassMain в две ступени). Возможно, это можно сделать с помощью каких-нибудь прагм (сказать компилятору, чтобы регеры были инициализированы как можно раньше). Возможно даже, порядок инициализации зависит от того, в каком порядке ты указывал библиотеки при линковке.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33866873
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это плохо. Может каким-то образом средствами С++ можно запретить статическое создание экземпляра?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33866922
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сомневаюсь. Опять же можешь посмотреть в прагмы или ещё куда. Но ведь приложение пишешь ты, в чём запарка? Если не найдёшь способа поместить кторы регеров в начало списка кторов, пиши подстраховку. Выдавай ошибку в случае статического создания. Или ещё что придумай.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33867012
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Библиотеки пишу я. Приложения будут разные и те только я их буду писать.
2. А как выдать ошибку в случае статического создания (я это и хотел узнать).
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33867239
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типа так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern int MainCalled= 0 ;

int main()
{
 MainCalled= 1 ;
 ...
}

class ClassMain
{
public:
 ClassMain()
 {
  if(!MainCalled)AchtungStaticInitialization("ClassMain");
 }
}
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33867245
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где надо, дописываешь "РУКАМИ НЕ ТРОГАТЬ!!!"
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33868127
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гениально! :) Спасибо.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33868401
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, как все закрутилось!
Можно я прокомментирую? Действительно нет никакой гарантии, что статические объекты в вашем случае будут созданы в правильном порядке (наш любимый С
++ гарантирует порядок создания статических объектов только в пределах единицы компиляции). Задачку, однако, решить можно, но не просто, и без разделяемых библиотек никуда. Сам не пробовал, знаю откуда можно попробовать выдрать – это АСЕ. Есть там такой ServiceConfigurator. Идея довольно простая: делаем разделяемую библиотеку в которую складываем функции с С связыванием (описанные как extern C) каждая из которых создает объекты одного класса, который нужно создавать. Иначе сойдешь с ума с приавилами поименования своего компилятора. Делаем текстовый (xml) файл с описанием связывающий имя класса, имя разделяемой библиотеки и имя фукции. Пишем фабрику, которая в своем конструкторе читает файл описания и создает ассоциативный контейнер. Осталось только сделать из этого класса синглетон. Только такой, чтобы вовремя создавался и разрушался.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33868520
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дорогой Akh! Спешу обрадовать, был не прав. Сделал как ты хотел. враги полтзователи библиотек даже static смогут юзать. см attachment
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33869898
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Довел до конца. Теперь и в runtime можно добавлять элементы к фабрике
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33876509
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedДовел до конца. Теперь и в runtime можно добавлять элементы к фабрике

Не подойдет. Т.к., если мне будет необходимо подключить несколько модулей к программе, то у меня будет несколько конструкторов фабрики. Использовать один конструктор неполучится, т.к. в этом случае он будет находиться внутри основного модуля (который будет юзать нужные ему классы). Но он не знает о нужных ему классах.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877366
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты это осилил? Герой. По-моему, это были чисто стихи.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877423
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoты это осилил? Герой. По-моему, это были чисто стихи.

Нечего подначивать. На самом деле, подошло время реализовывать требуемую возможность (модули теперь готовы).
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877455
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo

Да, кстати, вариант с MainCalled не так уж и хорош. Ставить этот флаг при запуске мэна, не очень хороший стиль. Может С++ сам ставить какой-нибудь флаг?

Сейчас вижу только один вариант - в основом уровне необходимо будет использовать метод связки его с нужным нижним уровнем. В конструкторе эта возможность будет недоступна.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877512
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhДа, кстати, вариант с MainCalled не так уж и хорош. Ставить этот флаг при запуске мэна, не очень хороший стиль.а по-моему, очень даже неплохой костыль. К тому же я предлагал разбить инициализацию на два шага.

AkhМожет С++ сам ставить какой-нибудь флаг?ересь. Мейн для него - такой же метод, как и все остальные. Загляни в crt1.c, может, что и нароешь... или нет... там это как-то по-другому называется, уже не помню, смотри в скрипты линкера, там эти объектники приводятся как crt_start.o и crt_end.o... как-то так, потом смотри, из чего эти объектники компилились. Но очень сомневаюсь... хотя... можно попытаться дотянуться до потрохов массива global_ctors (и посмотреть, все ли конструкторы вызваны). Не думаю, что это будет просто. К тому же это будет баааальшой и ужасный хак.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877589
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoересь. Мейн для него - такой же метод, как и все остальные.

Т.е. для С++ нет понятия старта программы? Или считается, что старт программы начинается с создания статических объектов?

maXmoЗагляни в crt1.c, может, что и нароешь... или нет... там это как-то по-другому называется, уже не помню, смотри в скрипты линкера, там эти объектники приводятся как crt_start.o и crt_end.o... как-то так, потом смотри, из чего эти объектники компилились. Но очень сомневаюсь... хотя... можно попытаться дотянуться до потрохов массива global_ctors (и посмотреть, все ли конструкторы вызваны). Не думаю, что это будет просто. К тому же это будет баааальшой и ужасный хак.

Уж лучше вы к нам (с) :)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877602
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разбиение инициализации на два шага - тоже не очень красиво. Это тоже костыль. MainCalled у меня предназначен только для предотвращения статического создания объектов. То есть это подстраховка на стадии запуска, а не в процессе работы. Ты, я так смотрю, хочешь сделать подстраховку в рантайме, то есть когда статически создаваемый объект делает вид, что всё хорошо, когда на самом деле всё плохо?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877614
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoА разбиение инициализации на два шага - тоже не очень красиво. Это тоже костыль. MainCalled у меня предназначен только для предотвращения статического создания объектов. То есть это подстраховка на стадии запуска, а не в процессе работы. Ты, я так смотрю, хочешь сделать подстраховку в рантайме, то есть когда статически создаваемый объект делает вид, что всё хорошо, когда на самом деле всё плохо?

Как раз наоборот. Я хочу разругаться, что объект создан статически и отказываться продолжать дальше работать. Такая ошибка будет выявляться сразу же на стадии разработки.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877622
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhТ.е. для С++ нет понятия старта программы? Или считается, что старт программы начинается с создания статических объектов?Ну, входная точка в код девелопера - это функция мейн. Создание статических объектов, инициализация кучи, разбор параметров командной строки, регистрация дефолтных обработчиков сигналов - это так, подготовка рабочей среды. Ты фактически вылезаешь из девелоперского кода.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877628
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhЯ хочу разругаться, что объект создан статически и отказываться продолжать дальше работать. Такая ошибка будет выявляться сразу же на стадии разработки.а... тогда я что-то не понял, что ты там про уровни говорил.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877654
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoНу, входная точка в код девелопера - это функция мейн. Создание статических объектов, инициализация кучи, разбор параметров командной строки, регистрация дефолтных обработчиков сигналов - это так, подготовка рабочей среды. Ты фактически вылезаешь из девелоперского кода.

Значит С++ дает средства для выполнения конструктора в из девелоперского кода и перед ним, но не дает средств для определения в каком коде происходит выполнение?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33877680
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo AkhЯ хочу разругаться, что объект создан статически и отказываться продолжать дальше работать. Такая ошибка будет выявляться сразу же на стадии разработки.а... тогда я что-то не понял, что ты там про уровни говорил.

Есть нижние уровни (допустим 1), есть верхние (допустим 2, 3...). Как стек tcp/ip. Вместо нижних, можно подставлять разные: на ком порту, на езернете, на виртуальном ком порте (с уже некоторой функциональностью). Уровень 3 говорит второму - работай с этим 1-м.

При добавляении новых уровней 1 (реализована возможность работать с другой железкой) уровень 2 не должен перекомпилироваться.

Все это в библиотеках

Пишется приложение, к которому подлинковываются нужные либы. Приложение через уровни вниз, говорит на каком уровне 1 оно должно работать. В процессе работы возможен переход на другой уровень 1.

Не помешало бы добавить возможность выбора уровня 1 в конструкторах высших над ним уровнях.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33878012
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhЗначит С++ дает средства для выполнения конструктора в из девелоперского кода и перед ним, но не дает средств для определения в каком коде происходит выполнение?ну девелоперский код ты сам пишешь и там как бы всё естественно проходит. Последовательность инициализации статических объектов определяешь не ты. Ну никак это не изменить. У сипп средств для этого нет, вернее, там всё инициализируется в той последовательности, в какой объекты встретились компилеру. В сети есть спецификация ANSI C++ и там весь раздел 3.6.2 - по твоей части. Очень интересно пишут. Читай всё.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33878017
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодец что прорвался через кодю Только вот главного и не заметил. В main.cpp есть typedef, определяющий MyFactory как Singleton. Если из модулей программы лбращатся к фабрике как
static Singleton< Factory<K, T> > myFactory;
myFactory->make(...);
то Singleton гарантирует что будет создана одна копия объекта Factory<K, T> и разрушена она будет когда будут удалены все ссылки на него. Причем даже если вы обратитесь к нему из статически создаваемого обекта. Кстати если ваше приложение многопоточное надо защитить счетчик ссылок мьютексом.
А что до вашего диспута, то понять где создается объект на стеке, в куче, или в статической памяти можно, только оно вам надо? Не лучше ли программировать так чтобы этого не требовалось.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33878023
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА что до вашего диспута, то понять где создается объект на стеке, в куче, или в статической памяти можно, только оно вам надо?да это как бы пофиг, но имхо, статические объекты создаются в статической памяти. В стандарте в частности написано, что сначала там нули, а потом на эти нули натравливается конструктор.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33878040
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded, кстати, как-то подозрительно выглядит у тебя добавление хелперов в список. В f1.cpp и f2.cpp у тебя приводится DECLARE_FACTORY(string, Base), это выливается в два объявления Factory<string,Base>::Factory(). По-моему, это не слинкуется. То есть ты не сможешь собрать этот проект со всеми четырьмя классами Child_1, Child_2, Child_3, Child_4.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33878589
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedМолодец что прорвался через кодю Только вот главного и не заметил. В main.cpp есть typedef, определяющий MyFactory как Singleton. Если из модулей программы лбращатся к фабрике как
static Singleton< Factory<K, T> > myFactory;
myFactory->make(...);
то Singleton гарантирует что будет создана одна копия объекта Factory<K, T> и разрушена она будет когда будут удалены все ссылки на него. Причем даже если вы обратитесь к нему из статически создаваемого обекта.

Из модулей программы нет смысла обращаться к мэйк, так как эта функция создания объекта, а не добавлсения его в мап. В этом случае надо будет вызывать адд фабрики, и это будет происходить на стадии создания статических вспомогательных классов. Опять же возвращаемся к проблеме статического создания.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33878600
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoВ сети есть спецификация ANSI C++ и там весь раздел 3.6.2 - по твоей части. Очень интересно пишут. Читай всё.

млин, никак найти не могу. где искать может помнишь?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33878606
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedА что до вашего диспута, то понять где создается объект на стеке, в куче, или в статической памяти можно, только оно вам надо? Не лучше ли программировать так чтобы этого не требовалось.

Как интересно определить?

Пока единственный выход - не давать создовать связи с нижними уровнями в конструкторе верхнего. Надо будет после создания объекта вызывать функцию привязки, что, как недавно тут обсуждалось, не является хорошим стилем
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33879758
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://anatolix.naumen.ru/Books/Index там вообще очень занятные книжечки.

blinded, сюда же наш любимый ClassMain.
Код: plaintext
1.
2.
3.
4.
5.
int main()
{
 static ClassMain ConstructorUsesMyFactory;
 static MyFactory myFactory;
...
}
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33879835
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему есть некоторое непонимание. Дело в том что глобальный 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 просто ликуются разные фабрики.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33879957
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну дык Akh просил доваление класса без перекомпиляции всяких модулей-связок. Так-то с возможностью перекомпиляции вообще можно даже не извращаться.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880002
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedТеперь что касается Двойной декларации фабрики, да этого сделать нельзя. Но это не есть недостаток, наоборот это преимущество, которое снижает вероятность ошибок ибо все что касается "зарядки фабрики" собрано в одном файле.

Уже наверное 3-й раз говорю в топике, что у меня может быть несколько модулей, которые должны добавляться к фабрике.

Как правельно заметил maXmo, модули должны просто прилинковываться в случае ниобходимости. Компиляция только приложения, дабы программист заморачивался только редакцией его приложения.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880023
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedК сообщению приложен файл (fac2_2.zip): cкачать . Размер - 2Kb

Все молчал, молчал... вот, все же решил сказать: если будешь еще что-нибудь аттачить, запаковывай, пожалуйста, зипом попроще. Без нескольких проходов. А то у меня gunzip не берет. :)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880033
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня 7zip схавал.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880080
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhКак правельно заметил maXmo, модули должны просто прилинковываться в случае ниобходимости. Компиляция только приложения, дабы программист заморачивался только редакцией его приложения.

почитай это если найдешь
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880105
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) AkhКак правельно заметил maXmo, модули должны просто прилинковываться в случае ниобходимости. Компиляция только приложения, дабы программист заморачивался только редакцией его приложения.

почитай это если найдешь

Я вчера добирался домой, взял пива и мне пришла гениальная мысль - задача, которую я решаю имеет ответ такой - драйверы. Не знаю на сколько эта мысля верна, но взглянув ни линух и форточку у меня сложилось такое впечатление.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880179
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почитай, книжка про это. я не поклонник подобных извращений но почитать стоит (стоит даже купить)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880394
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh blindedТеперь что касается Двойной декларации фабрики, да этого сделать нельзя. Но это не есть недостаток, наоборот это преимущество, которое снижает вероятность ошибок ибо все что касается "зарядки фабрики" собрано в одном файле.

Уже наверное 3-й раз говорю в топике, что у меня может быть несколько модулей, которые должны добавляться к фабрике.

Как правельно заметил maXmo, модули должны просто прилинковываться в случае ниобходимости. Компиляция только приложения, дабы программист заморачивался только редакцией его приложения.
Что-то я не пойму. Ты что пишешь набор библиотек и хочешь чтобы в зависимости от того какие библиотеки пользователь прилинковал такие классы в фабрике и оказались. Да еще чтобы фабрика была сформирована до того как ею попытаются воспользоваться из глобального статического объекта? Ну тонда ОЙ! Не знаю как это сделать и вряд-ли тебе кто поможет. Можно только скриптик накатать, который будет генерить cpp файл
Задачка имеет решение либо если бибилиотека одна (всю инициализацию в один модуль), либо если не заморачиваться с глобальными static ( в доку warning)
Извините за мой zip. Вот кому интересно. Присто я под cygwin сейчас.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880431
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedЧто-то я не пойму. Ты что пишешь набор библиотек и хочешь чтобы в зависимости от того какие библиотеки пользователь прилинковал такие классы в фабрике и оказались. Да еще чтобы фабрика была сформирована до того как ею попытаются воспользоваться из глобального статического объекта? Ну тонда ОЙ! Не знаю как это сделать и вряд-ли тебе кто поможет. Можно только скриптик накатать, который будет генерить cpp файл
Задачка имеет решение либо если бибилиотека одна (всю инициализацию в один модуль), либо если не заморачиваться с глобальными static ( в доку warning)
Извините за мой zip. Вот кому интересно. Присто я под cygwin сейчас.

Надо, все-таки внимательно читать топик. Значит, отвечаю по порядку:
1.да
2.нет. я хочу запретить создание объекта статически, который пользуется фабрикой. Т.е. конструктор объекта понимает, что его объект создается статически и говорит "Ой! segmentation fail" например. Лучше, конечно, чтобы он сказал что-нибудь члено раздельное, главное, чтобы он мог понять что-творится.

Уже мона и зипом, скачал p7zip (спасибо maXmo)
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880463
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придумал! Идея простая - запретить добавление к фабрике, после первого вызова метода make хоччешь сделаю и падать будет?
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880524
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedПридумал! Идея простая - запретить добавление к фабрике, после первого вызова метода make хоччешь сделаю и падать будет?

Не пойдет. Девелопер будет разрабатывать разрабатывать, все может быть будет работать нормально. Потом сделает реалайз уверенный что код написан отлично и сто раз проверен, перелинкует задом к жопе и не проверит. Приложение в последний момент может оказаться неработоспособным, хотя все было хорошо.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880733
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно это не то что вам хочется, но вме же. Кроме того рапишите ОГРОМНЫМИ БУКВАМИ В ДОКЕ и тогда это уже не ваша вина. А написать абсолютно надежные компоненты просто нельзя, всегда найдется хакер. я за 17 лет таких уродов повидал...
вот а в примере а1 -нормальный код и работает, а2 - код запрещенный, но работает (повезло), а а3 - тотже а2 но по-другому слинкованный (ну не повезло)ю Кстати чем больше проет, тем выше вероятность что не повезетю
PS Наезд по-поводу топика не принимаю, в нем ну ни слова о вашей задаче.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33880736
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Черт! забыл файло приложить
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33881222
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedPS Наезд по-поводу топика не принимаю, в нем ну ни слова о вашей задаче.

Вломак рыться по всему топику, вот, первое что попало на 3-й странице: см п.2
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33881237
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedКонечно это не то что вам хочется, но вме же. Кроме того рапишите ОГРОМНЫМИ БУКВАМИ В ДОКЕ и тогда это уже не ваша вина. А написать абсолютно надежные компоненты просто нельзя, всегда найдется хакер.

Расписать огромными буквами, это конечно же. Но их можно прочитать и забыть (я так частенько делаю :) ), а вот если программа сама будет говорить: "ну что же ты делаешь, подлец!", то это другое дело. ПО, должно само за себя отвечать.

Я беру расчет на нормальных программистов, которые должны будут заботиться о своем приложении. Если они будут извращаться над тем, что трогать не надо, это уже их проблемы.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33881253
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedа2 - код запрещенный, но работает (повезло)

у меня, кстати, не работает.
...
Рейтинг: 0 / 0
динамическое создание объекта, тип которого указан в виде строки.
    #33883592
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит тебе не повезло с а2. Тем не менее можно подвести черту под дискуссией: Захотелось нам изначально странного, а именно размазать конструктор класса (фабрики) по нескольким модулям. Пользуясь тем что наш класс - Singleton и пользуясь особенностями инициализации глобальных статических переменных нам это удалось, только вот из-за неопрделенного порядка инициализации этих самых глобальных статических переменных мы не смогли гарантировать завершение конструирования фабрики до ее использования в процессе построения других глобальных статических объектов. С этим уже ничего не поделать. Можно только написать документацию. убедить потребителей не использовать глобальные статические объекты, а юзать выше упомянутый Singleton. Ну а если библиотек будет всего 2-3 то монжно пойти на ломовой способ - написать 3 или 7 объектников реализующих конструктор фабрики (см предпоследнюю версию) А чтобы не ошибится в каждой бибилиотеке иметь функцию. добавляющую классы размещенные в библиотеке к фабрике. а в реализации конструкторов дергать нужные функции. И так и поставлять 3 библиотеки и 7 отдельных объектников
А здорово развлеклись... Еще такой вопрос хочу...
...
Рейтинг: 0 / 0
96 сообщений из 96, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамическое создание объекта, тип которого указан в виде строки.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]