2010-04-25 2 views
5

У меня есть программа на C++ с плагинами (динамическими libs). В основной программе я хочу выполнить статическую функцию, чтобы проверить, могу ли я создать объект этого типа.Заставить повторно статическую функцию в классах наследования

Пример без динамической LIBS (не neccesary понять проблему):

#include "libs/parent.h" 
#include "libs/one.h" 
#include "libs/two.h" 

int main(int argc, char * argv[]) 
{ 
    Parent* obj; 

    if (One::match(argv[1])) 
     obj = new One(); 
    else if (Two::match(argv[1])) 
     obj = new Two(); 
} 

Теперь у меня есть с именем родительского класса интерфейса. Все плагины наследуются от этого класса. В идеале, у меня есть виртуальная статическая функция в имени родителя с именем, и все плагины должны переопределить эту функцию.

Проблема с этим кодом заключается в том, что я не могу выполнять статическую виртуальную функцию на C++, поэтому я не знаю, как решить проблему.

Жалко ми английского языка, я сделал мой лучший

+0

Если функция 'match()' является статической, вы бы не называли ее 'One :: match()'? Почему он должен быть статичным? –

+0

Извините, я исправил ошибку Он должен быть статичным, потому что мне нужно вызвать его перед созданием объекта – pacopepe222

+0

Не беспокойтесь, я думаю, что использование чистого виртуального метода сработает для вас, но это не статично. Поэтому, возможно, ответы других могут помочь вам больше. –

ответ

5

То, что вы здесь классический завод шаблон. Вы хотите создать интерфейс с именем IPluginFactory, который будет иметь два метода: match и create (или, при желании, объединить их как в одном методе). Тогда каждая из ваших DLL-модулей плагина будет иметь класс, который реализует этот интерфейс.

Parent obj; 
    IPluginFactory *one = new OneFactory(); 
    IPluginFactory *two = new TwoFactory(); 

    if (one->match(argv[1])) 
     obj = one->createObj(); 
    else if (two->match(argv[1])) 
     obj = two->createObj(); 
+1

В этом ответе не рассматриваются функции «виртуального статического». –

+0

Он все же решает вопрос. –

+0

Я не вижу, как это относится к статическим функциям. Можете ли вы просветить меня? –

1

Вы можете добавить static string к каждому из ваших плагинов, которые будут держать его имя. Или создайте некоторую структуру с именем PluginID и добавьте эту string в эту структуру (и, возможно, что-то другое, зависящее от плагина).

Теперь совмещение в режиме исполнения кажется очень простым. Просто проверьте, соответствует ли эта статическая идентификационная строка вашего плагина вашим argv.

Это широко используемая реализация так называемого «вашего собственного и простого rtti», предполагая, что это решит ваши проблемы.

+0

Методы 'match' не обязательно проверяют на простое равенство. –

+0

Я согласен с тем, что создание фабрики объектов будет лучшим решением, но моя интуиция фактически говорит, что эта простая реализация rtti - это то, что будет работать в этом конкретном случае. –

+0

Проблема в том, что метод match() более сложный, чем простое сравнение строки, переданной argv, но спасибо! – pacopepe222

Смежные вопросы