2010-08-27 37 views
14

हम "सी ++" 'सी' कोड में वर्ग के सदस्य कार्यों कैसे फोन कर सकते हैं से समारोह?कॉलिंग "सी ++" वर्ग के सदस्य 'सी' कोड

मैं दो फ़ाइलों सीपीपी, जिसमें मैं कुछ वर्गों को परिभाषित किया है है सदस्य कार्य करता है और इसी " ज" फ़ाइलें जो कुछ दूसरे की मदद करने सीपीपी/एच फ़ाइलें शामिल किया गया है के साथ।

अब मैं 'सी' फ़ाइल में सीपीपी फ़ाइलों के इन कार्यक्षमता कॉल करना चाहते हैं। मैं यह कर सकता कैसे?

उत्तर

34

सी में thiscall धारणा नहीं है। सी कॉलिंग सम्मेलन सीधे सी ++ ओ को कॉल करने की अनुमति नहीं देता है सदस्य कार्य फेंक दें।

इसके लिए, आपको अपने सी ++ ऑब्जेक्ट के चारों ओर एक रैपर एपीआई की आपूर्ति करने की आवश्यकता है, जो स्पष्ट रूप से this पॉइंटर स्पष्ट रूप से लेता है।

उदाहरण:

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

सी आवरण एपीआई:

// 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 

आपका एपीआई 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); 
} 

वहाँ वहाँ बाहर महान प्रलेखन का एक बहुत है, भी । पहला I bumped intohere पाया जा सकता है।

+0

धन्यवाद xtofl, यहां तक ​​कि मैं सोच रहा था कि हम आवरण कार्यों लिखने की ज़रूरत है, लेकिन मैं कुछ संदेह है: 1. हम कैसे निपटते हैं, अगर वर्ग कुछ अन्य वर्गों से विरासत में मिली है, हम के लिए रैपर की जरूरत है पैरेंट क्लास फ़ंक्शन भी। 2. या हमें उन कार्यों के लिए रैपर लिखने की आवश्यकता है जिन्हें हम केवल "सी" फ़ाइल में बुला रहे हैं .... – Priyanshu

+0

@Priyanshu: एक दिलचस्प मोड़। सी वर्चुअल फ़ंक्शंस नहीं जानता है, लेकिन आपका एपीआई कोड करता है। इसलिए यदि 'डी' (वर्चुअल)' foo' फ़ंक्शन को ओवरराइड करेगा, तो आपको अपने एपीआई में अतिरिक्त 'D_Create' की आवश्यकता होगी। फैक्टरी पैटर्न की तरह, मैं कहूंगा। लेकिन शायद आपको अधिक ठोस जानकारी प्रदान करने की आवश्यकता है। – xtofl

+0

धन्यवाद xtofl, बस एक और बात, आपने उपरोक्त उदाहरण दिया है .... कक्षा सी { सार्वजनिक: बूल फू (int arg); }; अगर हम है क्लास सी { सार्वजनिक की तरह कुछ: bool foo (int आर्ग, एक्स * x); निजी: एक्स * एक्स; } }; फिर हम इसके लिए रैपर कैसे लिख सकते हैं ... क्या यह संभव है :-( – Priyanshu

संबंधित मुद्दे