gpt4 book ai didi

c++ - 如何包装具有参数的 C++ 类方法或在 C 中返回另一个 C++ 类的实例?

转载 作者:太空狗 更新时间:2023-10-29 15:39:44 25 4
gpt4 key购买 nike

我有一个 C++ 类 A 有一些方法,而其中一些使用另一个 C++ 类 B 的实例作为参数,一些返回另一个 C++ 类的实例 C。如何在 C 语言中正确包装 A 类及其所有方法?

我不认为我的问题是重复的,因为所有现有示例都显示了一个简单 C++ 类的 C 包装器( header 和源代码),其方法具有简单数据类型的参数或返回值,例如 int, char*

class A {
public:
A(int param1);
int getValue();
private:
int value;
}

// method B::DoSomething() has a parameter of type (class) "A"
class B {
public:
void DoSomething(A param1);
}

// method C::SetSomething() returns an instance of class "A"
class C {
public:
A SetSomething(int value);
}

我知道如何为 A 类及其方法编写 C 语言包装器:使用 extern "C"{ ... } 构造。

但是如何为类 BC 及其方法做到这一点?

最佳答案

一般的方法是为每个 C++ 类创建一个包装器和一个方法来生成指向这些包装器的指针,另一个方法来删除它们。

extern "C" {

struct WA{
void* self;
};

struct WA* new_A( int p1 ){
WA* wa = new WA;
wa->self = new A( p1 );
return wa;
}

void delete_A( WA* wa ){
delete static_cast<A*>( wa->self );
delete wa;
}

}

然后将每个类的每个方法转换为一个函数,该函数将结构指针作为第一个参数。 A::getValue 变为

int A_getValue( WA* wa) {
return static_cast<A*>( wa->self )->getValue();
}

实例可以通过指针传入,所以B::DoSomething变成了

void B_DoSomething( WB *wb, WA *param1){
static_cast<B*>( wb->self )->DoSomething( *static_cast<A*>( param1->self ) );
}

同样,您可以通过指针返回实例。 C::SetSomething 然后变成

struct WA* C_SetSomething( WC* wc, int value ){
A a = static_cast<C*>( wc->self )->SetSomething( value );
return new_A( a.getValue() );
}

您需要非常小心地管理 C 代码中的内存。查看工作示例 here .

关于c++ - 如何包装具有参数的 C++ 类方法或在 C 中返回另一个 C++ 类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58087588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com