Сила для перереализации статической функции в наследовала классы

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

Пример без динамического освобождает (не 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++, таким образом, я не знаю, как решить проблему.

Извините за английский язык ми я приложил все усилия

5
задан kennytm 25 April 2010 в 13:05
поделиться

2 ответа

Здесь вы видите классический узор factory . Вы хотите создать интерфейс с именем 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();
5
ответ дан 14 December 2019 в 13:30
поделиться

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

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

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

1
ответ дан 14 December 2019 в 13:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: