Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Июль 29, 2012, 20:33



Название: Чтение функций из строки
Отправлено: virtual_root от Июль 29, 2012, 20:33
Добрый вечер! Передо мной стала небольшая проблема: получаю в строке объект название класса объект которого нужно создать, и получаю в строке название функции которую нужно выполнить.
Знаю что в C# такое возможно сделать, но никогда ранее не сталкивалась с таким в с++. Ребята подскажите решение пожалуйста!


Название: Re: Чтение функций из строки
Отправлено: kambala от Июль 29, 2012, 21:07
см. QMetaObject, но вызывать можно только сигналы/слоты


Название: Re: Чтение функций из строки
Отправлено: virtual_root от Июль 29, 2012, 21:41
спасибо обязательно посмотрю, а ещё есть у кого какие идеи?


Название: Re: Чтение функций из строки
Отправлено: andrew.k от Июль 30, 2012, 01:39
спасибо обязательно посмотрю, а ещё есть у кого какие идеи?
Какие еще могут быть идеи?
QMetaObject newInstance invokeMethod
все что тебе нужно


Название: Re: Чтение функций из строки
Отправлено: mutineer от Июль 30, 2012, 10:19
Средствами только C++ (без Qt) такое можно сделать только вереницей if со сравнением строк


Название: Re: Чтение функций из строки
Отправлено: Пантер от Июль 30, 2012, 10:45
Средствами только C++ (без Qt) такое можно сделать только вереницей if со сравнением строк
Или мапой.


Название: Re: Чтение функций из строки
Отправлено: virtual_root от Июль 30, 2012, 13:43
спасибо всем.  я просто размышляла над тем, как возможно подключать плагины к готовой программе. И мне пришла идея, что можно загружать dll этих плагинов и какой-нибудь конфигурационный файлик к каждой из них должен идти. в этом файлике указано какой класс из библиотеки нужно запустить чтобы плагин заработал(сам себя поднял). Вот мне и понадобилось из строки получить название класса и создать объект.


Название: Re: Чтение функций из строки
Отправлено: Bepec от Июль 30, 2012, 14:30
Изначально плохая идея. Почитайте про систему плагинов. Плагины должны цепляться за интерфейсы.


Название: Re: Чтение функций из строки
Отправлено: virtual_root от Июль 30, 2012, 15:58
Читала. Поняла что можно сделать так:
Есть интерфейс от которого наследуются все плагины. в интерфейсе прописаны функции - шлюзы через которые между плагином и главной программой передаются данные.
Но ведь мне всё равно придется создать объект плагина, а для этого мне нужно получить его имя. Можно конечно загрузить библиотеку(плагин) через QLibrary::load(); Но тогда остаётся вопрос как мне зарезолвить функцию init() из плагина из класса А например ?
Мне не понятно как можно общаться с плагином предварительно не создав его объект иил не выделив память под указатель на него ?


Название: Re: Чтение функций из строки
Отправлено: Kurles от Июль 30, 2012, 16:26
Читала. Поняла что можно сделать так:
Есть интерфейс от которого наследуются все плагины. в интерфейсе прописаны функции - шлюзы через которые между плагином и главной программой передаются данные.
Но ведь мне всё равно придется создать объект плагина, а для этого мне нужно получить его имя. Можно конечно загрузить библиотеку(плагин) через QLibrary::load(); Но тогда остаётся вопрос как мне зарезолвить функцию init() из плагина из класса А например ?
Мне не понятно как можно общаться с плагином предварительно не создав его объект иил не выделив память под указатель на него ?
Относительно Qt посмотри в сторону QPluginLoader, в частности на его метод QObject * QPluginLoader::instance (). Ну и на стандартный пример Plug & Paint Example.


Название: Re: Чтение функций из строки
Отправлено: Kurles от Июль 30, 2012, 16:33
Можно, конечно, и QLibrary обойтись - определить в плагине глобальную функцию void * instance() например, которая будет возвращать тебе указатель на созданый ею экземпляр твоего класса, и резолвить ее с помощью void * QLibrary::resolve(const char* symbol), после чего через интерфейсный класс вызывать функции плагина.


Название: Re: Чтение функций из строки
Отправлено: DmitryM от Июль 30, 2012, 16:54
Читала. Поняла что можно сделать так:
Есть интерфейс от которого наследуются все плагины. в интерфейсе прописаны функции - шлюзы через которые между плагином и главной программой передаются данные.
Но ведь мне всё равно придется создать объект плагина, а для этого мне нужно получить его имя. Можно конечно загрузить библиотеку(плагин) через QLibrary::load(); Но тогда остаётся вопрос как мне зарезолвить функцию init() из плагина из класса А например ?
Мне не понятно как можно общаться с плагином предварительно не создав его объект иил не выделив память под указатель на него ?
Создание и использование динамических библиотек, написанных на различных языках (C/C++, Pascal) (http://habrahabr.ru/post/122757/) пихаешь в dll функцию аля create_plugin, которая выдаст объект плагина, и работаешь.