Избегайте глобальных объектов в библиотеке C ++

0

У меня есть библиотека C++, предоставляющая собственный C API для своего клиента. Фактически эта библиотека является оболочкой вокруг некоторого экземпляра класса, а вызовы API должны работать с одним и тем же экземпляром класса, используя его публичный интерфейс, например:

// library API, using class methods internally
MYDLL_API uint8_t __stdcall init();
MYDLL_API uint8_t __stdcall release();
MYDLL_API uint8_t __stdcall setSomething();
MYDLL_API uint8_t __stdcall doSomething();

// some inernal class
class Foo{
public:
    void setSomething();
    void doSomething();
private
    // some state
};

Единственный способ предоставить все возможности API-вызовов работать с одним и тем же экземпляром Foo я вижу, - это использовать глобальный экземпляр этого класса, одноэлементный. Я хочу избежать использования глобальных переменных, как это можно достичь?

Теги:
dll
design
global

2 ответа

3
Лучший ответ

Одна из возможностей - вернуть указатель void экземпляра, который вы создаете для вызывающего, и передать вызывающий код всем функциям. Библиотека может наложить этот указатель на соответствующий тип и вызвать методы в экземпляре.

Это не очень, но вы хотите API C, так что вы можете ожидать.

0

Похоже на плохой дизайн, библиотеки должны работать в многопоточных средах. Эта необходимость для "всех вызовов API-вызовов для работы с одним и тем же экземпляром Foo" предотвращает очень плохое.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню