2014-07-23 2 views
0

클라이언트에 원시 C API를 제공하는 C++ 라이브러리가 있습니다. 모든 API를 제공하는C++ 라이브러리에서 전역 객체 피하기

// 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 호출의 래퍼입니다 same Foo 인스턴스는이 클래스의 글로벌 인스턴스를 사용할 수있는 것으로, 싱글 톤 가능합니다. 전역 변수 사용을 피하고 싶습니다. 어떻게 도달 할 수 있습니까?

답변

3

하나의 가능성은 호출자에게 작성한 인스턴스의 void 포인터를 리턴하고 호출자가이를 모든 기능에 전달하도록하는 것입니다. 라이브러리는 해당 포인터를 적절한 유형으로 캐스팅하고 인스턴스의 메소드를 호출 할 수 있습니다.

귀엽지는 않지만 C API를 원한다면 무엇을 기대할 수 있습니다.

0

나쁜 디자인처럼 보이지만 라이브러리는 멀티 스레드 환경에서 작동해야합니다. "모든 API 호출이 동일한 Foo 인스턴스로 작업 할 수있는 능력"에 대한 필요성은 이 매우 인 것을 방지합니다.