Название: Чтение функций из строки Отправлено: 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 Читала. Поняла что можно сделать так: Относительно Qt посмотри в сторону QPluginLoader, в частности на его метод QObject * QPluginLoader::instance (). Ну и на стандартный пример Plug & Paint Example.Есть интерфейс от которого наследуются все плагины. в интерфейсе прописаны функции - шлюзы через которые между плагином и главной программой передаются данные. Но ведь мне всё равно придется создать объект плагина, а для этого мне нужно получить его имя. Можно конечно загрузить библиотеку(плагин) через QLibrary::load(); Но тогда остаётся вопрос как мне зарезолвить функцию init() из плагина из класса А например ? Мне не понятно как можно общаться с плагином предварительно не создав его объект иил не выделив память под указатель на него ? Название: Re: Чтение функций из строки Отправлено: Kurles от Июль 30, 2012, 16:33 Можно, конечно, и QLibrary обойтись - определить в плагине глобальную функцию void * instance() например, которая будет возвращать тебе указатель на созданый ею экземпляр твоего класса, и резолвить ее с помощью void * QLibrary::resolve(const char* symbol), после чего через интерфейсный класс вызывать функции плагина.
Название: Re: Чтение функций из строки Отправлено: DmitryM от Июль 30, 2012, 16:54 Читала. Поняла что можно сделать так: Создание и использование динамических библиотек, написанных на различных языках (C/C++, Pascal) (http://habrahabr.ru/post/122757/) пихаешь в dll функцию аля create_plugin, которая выдаст объект плагина, и работаешь. Есть интерфейс от которого наследуются все плагины. в интерфейсе прописаны функции - шлюзы через которые между плагином и главной программой передаются данные. Но ведь мне всё равно придется создать объект плагина, а для этого мне нужно получить его имя. Можно конечно загрузить библиотеку(плагин) через QLibrary::load(); Но тогда остаётся вопрос как мне зарезолвить функцию init() из плагина из класса А например ? Мне не понятно как можно общаться с плагином предварительно не создав его объект иил не выделив память под указатель на него ? |