powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамическое создание объекта, тип которого указан в виде строки.
25 сообщений из 96, страница 1 из 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
25 сообщений из 96, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамическое создание объекта, тип которого указан в виде строки.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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