C 呼叫 C++ 類
阿新 • • 發佈:2018-11-28
現在有個類Person
,其中成員函式分別用於獲取 name 和 age:
- GetName()
- GetAge()
我們希望可以在 C 程式碼中呼叫 C++ 類的方法。
person.h
class Person {
public:
Person(std::string name, int age);
~Person() {}
const char *GetName() { return name_.c_str(); }
int GetAge() { return age_; }
private:
std::string name_;
int age_;
};
person.cpp
Person::Person(std::string name, int age)
: name_(name), age_(age) {}
wrapper
包裝了 Person 的建立和釋放,以及 Person 的成員函式。
wrapper.h
#ifdef __cplusplus
extern "C"
{
#endif
void *call_Person_Create();
void call_Person_Destroy(void *);
int call_Person_GetAge(void *);
const char *call_Person_GetName(void *);
#ifdef __cplusplus
}
#endif
wrapper.cpp
void *call_Person_Create() {
return new Person("Aland", 18); // 構造
}
void call_Person_Destroy(void *p) {
delete static_cast<Person *>(p); // 釋放
}
int call_Person_GetAge(void *p) {
return static_cast<Person *>(p)->GetAge();
}
const char *call_Person_GetName(void *p) {
return static_cast<Person *>(p)->GetName();
}
現在我們在 main.c 中呼叫 Person 的方法:
int main() {
void *p = call_Person_Create();
int age = call_Person_GetAge(p);
const char *name = call_Person_GetName(p);
call_Person_Destroy(p); // 記得釋放 p
printf("name=%s, age=%d\n", name, age);
}
完整程式碼地址 https://github.com/alandtsang/cppdemo/tree/master/src/ccallcpp
參考
http://www.stroustrup.com/bs_faq2.html#callCpp