14
我們如何調用「C」代碼「C++」類的成員函數功能?調用「C++」類成員從「C」代碼
我有兩個文件的.cpp,在我所定義的一些類與
已經包括了一些其他幫助的CPP/h的文件,成員函數和相應的「 .h」頭文件。現在,我想打電話的CPP文件中的這些功能中的「C」文件。 我該怎麼辦呢?
我們如何調用「C」代碼「C++」類的成員函數功能?調用「C++」類成員從「C」代碼
我有兩個文件的.cpp,在我所定義的一些類與
已經包括了一些其他幫助的CPP/h的文件,成員函數和相應的「 .h」頭文件。現在,我想打電話的CPP文件中的這些功能中的「C」文件。 我該怎麼辦呢?
C沒有thiscall
概念C調用約定不允許直接調用C++ o對象成員函數。
因此,您需要提供圍繞您的C++對象的包裝API,它明確地取代this
指針,而不是隱式地取代。
例子:
// C.hpp
// uses C++ calling convention
class C {
public:
bool foo(int arg);
};
C包裝API:
// 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
你的API將會用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 into可以找到here。
謝謝xtofl, 連我在想,我們需要寫的包裝功能,但是我有些疑惑: 1.我們如何處理,如果類是由別的類繼承,我們需要對包裝父類功能也。 2.或者我們需要編寫包裝函數,我們只需要在「C」文件中調用.... – Priyanshu 2010-08-27 10:57:40
@Priyanshu:一個有趣的轉折。 C不知道虛擬函數,但你的API代碼確實如此。所以如果'D'會覆蓋(虛擬)'foo'函數,那麼您需要額外的就是在您的API中使用'D_Create'。就像工廠模式,我會說。 但也許你需要提供更多的具體信息。 – xtofl 2010-08-27 11:05:06
謝謝xtofl, 還有一件事,你已經給出了上面的例子.... class C { public: bool foo(int arg); }; 如果我們有這樣的事 C類{ 市民: 布爾FOO(INT ARG,X * X); private: X * x; } }; 那麼我們該如何編寫包裝器......這是可能的:-( – Priyanshu 2010-08-27 11:12:13