2014-07-23 2 views
0

J'ai une bibliothèque C++, fournissant une API C native à son client. En fait, cette bibliothèque est un wrapper autour des appels d'instance de classe et l'API devrait fonctionner avec la même instance de classe, en utilisant son interface publique, par exemple:Éviter l'objet global dans la bibliothèque 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 
}; 

La seule façon de fournir tous les appels d'API capacité à travailler avec le même instance Foo je vois est d'utiliser l'instance globale de cette classe, singleton possible. Je veux éviter d'utiliser des variables globales, comment pourrait-on l'atteindre?

Répondre

3

Une possibilité consiste à renvoyer un pointeur vide de l'instance que vous créez à l'appelant et à ce que l'appelant le transmette à toutes les fonctions. La bibliothèque peut convertir ce pointeur vers le type approprié et appeler les méthodes sur l'instance.

Ce n'est pas joli, mais vous voulez une API C, alors à quoi pouvez-vous vous attendre.

0

Cela ressemble à un mauvais design, les bibliothèques devraient fonctionner dans des environnements multithread. Ce besoin de "toute capacité d'appel d'API à travailler avec la même instance de Foo" empêche ce qui est très mauvais.

Questions connexes