Задаю вопрос не в "общих вопросах...", а здесь, т.к. интересует ответ не в общем виде, а специфика плюсов.
Задача типовая, вроде бы: есть две библиотеки сишные с разными 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+ на данный момент не доступны.
Всем заранее спасибо за мнения и советы!