2010-08-27 4 views
14

Comment peut-on appeler « C++ » fonctions membres de la classe dans le code « C »?appel « C++ » fonction membre de la classe de « C » Code

J'ai deux fichiers Cpp, dans lequel j'ai défini certaines classes avec des fonctions membres et fichiers correspondants « .h » qui a inclus d'autres aider cpp/fichiers h.

maintenant, je veux appeler ces fonctionnalités de fichiers du RPC dans le fichier « C ». Comment puis-je faire?

Répondre

34

C n'a pas de notion thiscall La convention d'appel C ne permet pas d'appeler directement C++ o bjecter les fonctions membres. Par conséquent, vous devez fournir une API wrapper autour de votre objet C++, qui prend explicitement le pointeur this au lieu de l'implicitement.

Exemple:

// C.hpp 
// uses C++ calling convention 
class C { 
public: 
    bool foo(int arg); 
}; 

API wrapper C:

// api.h 
// uses C calling convention 
#ifdef __cplusplus 
extern "C" { 
#endif 

void* C_Create(); 
void C_Destroy(void* thisC); 
bool C_foo(void* thisC, int arg); 

#ifdef __cplusplus 
} 
#endif 

Votre API sera implémenté en C++:

#include "api.h" 
#include "C.hpp" 

void* C_Create() { return new C(); } 
void C_Destroy(void* thisC) { 
    delete static_cast<C*>(thisC); 
} 
bool C_foo(void* thisC, int arg) { 
    return static_cast<C*>(thisC)->foo(arg); 
} 

Il y a beaucoup de grands documents là-bas, aussi . Le premier I bumped into peut être trouvé here.

+0

Merci xtofl, Même je pensais que nous avons besoin d'écrire des fonctions wrapper, mais j'ai quelques doutes: 1. Comment traitons-nous, si la classe est héritée de quelques autres classes, avons-nous besoin wrappers pour fonctions de classe parent aussi. 2. OU nous avons besoin d'écrire des enveloppes à des fonctions que nous appelons dans le fichier "C" seulement .... – Priyanshu

+0

@Priyanshu: une torsion intéressante. C ne connaît pas les fonctions virtuelles, mais votre code API. Donc, si 'D 'remplace la fonction (virtuelle)' foo', tout ce dont vous avez besoin est un 'D_Create' dans votre API. Tout comme le modèle Factory, je dirais. Mais peut-être que vous avez besoin de fournir des informations plus concrètes. – xtofl

+0

Merci xtofl, Encore une chose, vous avez donné l'exemple ci-dessus .... classe C { public: bool foo (int arg); }; Si nous avons quelque chose comme classe C { public: bool foo (int arg, X * x); privé: X * x; } }; Alors Comment pouvons-nous écrire wrapper pour cela ... est-il possible :-( – Priyanshu

Questions connexes