Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ XML ошибка формата https://www.cyberforum.ru/ cpp/ thread123873.html
не знаю куда еще написать, браузер при открытии xml пишет XML Parsing Error: not well-formed Location:...
Правильное чтение из файла! C++
Помогите пожалуйста, уже опробовал все((( Суть задачи такая, есть файл data.txt в нем есть числа выглядит он так: 200,100,100, 100, 300 Ниже представлен код программы, которая просит ввести...
C++ Функции!
Приношу свои извинения за этот глупый вопрос, я начинающий программист и сейчас прохожу урок Функции, но не могу понять, очень не понятно описывается, подскажите что такое функции и для чего они...
C++ Любопытственная ошибка В программе глобально объявлен буфер для передачи сообщений по каналу: char MsgBuf; Далее при формировани сообщения: MsgBuf="go"; Следующая ошибка: error C2440: '=' : cannot convert from... https://www.cyberforum.ru/ cpp/ thread123262.html
C++ Перевод из Паскаля в СИ. https://www.cyberforum.ru/ cpp/ thread123250.html
Доброго времени суток. Помогите перевести программу из паскаля в СИ. 1 программа: Program oblast; uses crt; var a,b,z:real; c:boolean; begin clrscr; write('Введите a='); readln(a);
Динамические потоки c обрабатываемой памятью C++
Нужна ваша помощь. #include "WinThread.h" LPVOID hf1,hf2,hf3; iXml* Tr; AnsiString str; std::vector<GraphObj *> *GNO; typedef struct Params
C++ из паскаля в си_1
program kontrolnaya; uses crt; var a,b,z,r:real; begin clrscr; write('a=');readln(a); write('b=');readln(b); write('r=');readln(r); if (((a-5)*(a-5)+b*b<r*r) and not((a+5)*(a+5)+b*b<r*r)) or...
C++ из паскаля в си_2 пожалуйста, помогите переписать на с++(((((((((((((( program kontr; uses crt; const nmax=100; type mas=array of integer; procedure Vvod(var v:mas;var x:byte); var i:byte; begin https://www.cyberforum.ru/ cpp/ thread122999.html
C++ В каком SDK находятся библиотечные файлы Urlmon.lib winmm.lib https://www.cyberforum.ru/ cpp/ thread122899.html
В каком SDK находятся библиотечные файлы Urlmon.lib winmm.lib? Я предполагал что в Direct SDK(у меня DirectX SDK 2006), однако там не нашел. Может кто подскажет где находятся и какую...
C++ Транслятор с паскаля на С Салют! Можете привести самый простой пример транслятора с паскаля на С, заранее спасибо https://www.cyberforum.ru/ cpp/ thread122831.html
Эксперт С++
3210 / 1459 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.03.2011, 13:46  [ТС] 0

Теория плагинов

12.03.2011, 13:46. Просмотров 27226. Ответов 40
Метки (Все метки)

Ответ

есть базовый тип для плагинов:
C++
1
2
3
4
5
struct plugin_object {
   virtual const char* name() const = 0;
   virtual const char* description() const { return "null"; }
   virtual const char* version() const { return "null"; }
};
далее я наследуюсь от него и реализую собственный тип.
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct type1: plugin_object {
   type1();
   virtual const char* name() const;
   virtual const char* description() const;
   virtual const char* version() const;
   
   void set(int);
   int get() const;
   
private:
   int val;
};
реализация в .cpp фале. ее приводить не буду. ничего интересного в ней нет.

собираю плагин так:
> g++ -fPIC -c test.cpp
> g++ -shared test.o -o test.so
тестовое приложение выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, char** argv) {
   plugin_loader plugin("test.so");
   plugin_object* obj = plugin.instance();
 
   std::cout
   << "name: " << obj->name() << std::endl
   << "description: " << obj->description() << std::endl
   << "version: " << obj->version() << std::endl;
 
   type1* t1 = static_cast<type1*>(obj);
   int v = t1->get();
   std::cout << "v = " << v << std::endl;
   t1->set(33);
   v = t1->get();
   std::cout << "v = " << v << std::endl;
}
при линковке получаю это:
undefined reference to `type1::get() const'
undefined reference to `type1::set(int)'
undefined reference to `type1::get() const'
оно и понятно, еще несколько моментов необходимо знать:
1) методы реализаций должны быть виртуальными.
т.е. в наши методы get() и set() нужно добавить спецификатор virtual.

2) в хидере, не пишите реализацию, т.к. в таком случае, компилятор будет использовать ее, и получится каша
пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct type1: plugin_object {
   type1();
   virtual const char* name() const;
   virtual const char* description() const;
   virtual const char* version() const;
   
   virtual void set(int);
   virtual int get() const { return 44; }
   
private:
   int val;
};
при вызове метода get() из тестового приложения, вы вне зависимости от реализации в .so файле, получите как результат 44

Вернуться к обсуждению:
Теория плагинов
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2011, 13:46
Готовые ответы и решения:

Написание плагинов для notepad++
Добрый день! Есть задача написания плагина для notepad++ - немного модифицировать его графический...

Система плагинов
Добрый день форумчане. У меня к вам есть вопрос. Кратко. Как можно реализовать систему плагинов?...

Взаимодействие плагинов
Приветствую, товарищи. Возникла такая необходимость. Намерен сделать два плагина. Конкретнее, два...

Подключение плагинов к программе
Появилась необходимость в разработке текстового редактора с возможностью подключения своих...

40
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.