gpt4 book ai didi

c++ - 将 C++ 成员函数传递给 C 函数

转载 作者:太空狗 更新时间:2023-10-29 20:08:34 24 4
gpt4 key购买 nike

我们有一个接受 C 函数指针的结构:

int one(int x)
{
}

int two(int x)
{
}

struct Cstruct
{
int (*fn1)(int);
int (*fn2)(int);
};

现在我有一个具有以下方法的 C++ 类:

class A
{
public:
int one(int x)
{
}

int two(int x)
{
}

int three(int x)
{
struct Cstruct cstr = {&this->one, &this->two};
}
};

在尝试初始化 Cstruct 编译器实例的类 A 方法地址时出现无效转换错误?

如何将Class成员函数地址赋值给Cstruct?

最佳答案

你不能这样做,因为指向非静态成员函数的 C++ 指针与非成员函数指针类型不兼容。这是因为成员函数需要一个额外的参数 - 需要调用成员函数的对象,它在调用中成为 this 指针。

如果您将成员函数设为静态,您的代码将可以编译。但是,它不一定会实现您想要实现的目标,因为 onetwo 无法访问 A 的其他非静态成员。

将成员函数传递给 C 函数的技巧需要传递一个带有“注册”记录的附加 void* 指针,并让 C 代码将其传递回您的静态回调函数:

struct Cstruct
{
void *context; // Add this field
int (*fn1)(void*, int);
int (*fn2)(void*, int);
};

class A
{
public:
static int oneWrap(void* ptr, int x)
{
return static_cast<A*>(ptr)->one(x);
}

static int twoWrap(void* ptr, int x)
{
return static_cast<A*>(ptr)->two(x);
}

int one(int x)
{
}

int two(int x)
{
}

int three(int x)
{
struct Cstruct cstr = {this, &this->oneWrap, &this->twoWrap};
}
};

C 代码需要将 context 的值传递给 fn1fn2:

cs.fn1(cs.context, 123);
cs.fn2(cs.context, 456);

关于c++ - 将 C++ 成员函数传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52504511/

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