Russian Qt Forum
Ноябрь 25, 2024, 05:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение функций из строки  (Прочитано 6146 раз)
virtual_root
Гость
« : Июль 29, 2012, 20:33 »

Добрый вечер! Передо мной стала небольшая проблема: получаю в строке объект название класса объект которого нужно создать, и получаю в строке название функции которую нужно выполнить.
Знаю что в C# такое возможно сделать, но никогда ранее не сталкивалась с таким в с++. Ребята подскажите решение пожалуйста!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июль 29, 2012, 21:07 »

см. QMetaObject, но вызывать можно только сигналы/слоты
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #2 : Июль 29, 2012, 21:41 »

спасибо обязательно посмотрю, а ещё есть у кого какие идеи?
Записан
andrew.k
Гость
« Ответ #3 : Июль 30, 2012, 01:39 »

спасибо обязательно посмотрю, а ещё есть у кого какие идеи?
Какие еще могут быть идеи?
QMetaObject newInstance invokeMethod
все что тебе нужно
Записан
mutineer
Гость
« Ответ #4 : Июль 30, 2012, 10:19 »

Средствами только C++ (без Qt) такое можно сделать только вереницей if со сравнением строк
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Июль 30, 2012, 10:45 »

Средствами только C++ (без Qt) такое можно сделать только вереницей if со сравнением строк
Или мапой.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
virtual_root
Гость
« Ответ #6 : Июль 30, 2012, 13:43 »

спасибо всем.  я просто размышляла над тем, как возможно подключать плагины к готовой программе. И мне пришла идея, что можно загружать dll этих плагинов и какой-нибудь конфигурационный файлик к каждой из них должен идти. в этом файлике указано какой класс из библиотеки нужно запустить чтобы плагин заработал(сам себя поднял). Вот мне и понадобилось из строки получить название класса и создать объект.
Записан
Bepec
Гость
« Ответ #7 : Июль 30, 2012, 14:30 »

Изначально плохая идея. Почитайте про систему плагинов. Плагины должны цепляться за интерфейсы.
Записан
virtual_root
Гость
« Ответ #8 : Июль 30, 2012, 15:58 »

Читала. Поняла что можно сделать так:
Есть интерфейс от которого наследуются все плагины. в интерфейсе прописаны функции - шлюзы через которые между плагином и главной программой передаются данные.
Но ведь мне всё равно придется создать объект плагина, а для этого мне нужно получить его имя. Можно конечно загрузить библиотеку(плагин) через QLibrary::load(); Но тогда остаётся вопрос как мне зарезолвить функцию init() из плагина из класса А например ?
Мне не понятно как можно общаться с плагином предварительно не создав его объект иил не выделив память под указатель на него ?
« Последнее редактирование: Июль 30, 2012, 16:13 от tiny developer » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #9 : Июль 30, 2012, 16:26 »

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

Код
C++ (Qt)
while(!asleep()) sheep++;
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #10 : Июль 30, 2012, 16:33 »

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

Код
C++ (Qt)
while(!asleep()) sheep++;
DmitryM
Гость
« Ответ #11 : Июль 30, 2012, 16:54 »

Читала. Поняла что можно сделать так:
Есть интерфейс от которого наследуются все плагины. в интерфейсе прописаны функции - шлюзы через которые между плагином и главной программой передаются данные.
Но ведь мне всё равно придется создать объект плагина, а для этого мне нужно получить его имя. Можно конечно загрузить библиотеку(плагин) через QLibrary::load(); Но тогда остаётся вопрос как мне зарезолвить функцию init() из плагина из класса А например ?
Мне не понятно как можно общаться с плагином предварительно не создав его объект иил не выделив память под указатель на него ?
Создание и использование динамических библиотек, написанных на различных языках (C/C++, Pascal) пихаешь в dll функцию аля create_plugin, которая выдаст объект плагина, и работаешь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.