как решать типовую задачу: сделать интерфейс для API
От: ksd Россия  
Дата: 28.02.17 08:57
Оценка:
Задаю вопрос не в "общих вопросах...", а здесь, т.к. интересует ответ не в общем виде, а специфика плюсов.

Задача типовая, вроде бы: есть две библиотеки сишные с разными API, но которые реализуют одинаковый функционал. Совпадают определения только самых важных функций, самой соли этих библиотек. Как правильно сделать общую обертку/интерфейс для этих библиотек? Думаю сделать так:

struct IAPI
{
    virtual void foo() = 0;
    virtual void bar() = 0;
    virtual int dojob(void* p1, void* p2, void** p3) = 0;
};

class Lib1API: public IAPI {...}; // виртуальные методы вызывают статические функции либы 1
class Lib2API: public IAPI {...}; // виртуальные методы вызывают статические функции либы 2

struct APIFactory
{
    enum EWhatAPI {ewaLib1, ewaLib2};
    static IAPI* Create(EWhatAPI ewa) {
        if (ewaLib2 == ewa)
            return new Lib2API;
        return new Lib1API;
    }
};


Что не нравится:
1. создается динамический объект для вызова статических функций. может, использовать синглетон?
2. интерфейс предполагает использование указателя на класс с виртуальными методами, если получение указателя не вызывает вопросов, то как лучше быть с его освобождением? всегда удалять delete-ом? ничего не делать (если сделать синглетон)? прикрутить какой-нибудь release в интерфейс или free в фабрику?
3. все совсем не так надо делать?

П.С. буст и с++11+ на данный момент не доступны.

Всем заранее спасибо за мнения и советы!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.