C++ 如何修改C++;从C回调中初始化成员变量
我的目标是在C++ 如何修改C++;从C回调中初始化成员变量,c++,c,methods,callback,member,C++,C,Methods,Callback,Member,我的目标是在TTerm中更改宽度和高度 #include <iostream> extern "C" { void SomeCFunctionThatRequireCallback(void (*FuncPtr)(int Width, int Height)) { FuncPtr(80, 20); } } class TTerm { public: int IO; int WinchFds[2];
TTerm
中更改宽度和高度
#include <iostream>
extern "C"
{
void SomeCFunctionThatRequireCallback(void (*FuncPtr)(int Width, int Height))
{
FuncPtr(80, 20);
}
}
class TTerm
{
public:
int IO;
int WinchFds[2];
int Width;
int Height;
TTerm()
{
SomeCFunctionThatRequireCallback(OnResizeCallback);
}
static void OnResizeCallback(int Width, int Height)
{
// Set this->Width and this->Height
}
};
int main()
{
TTerm Term;
}
#包括
外部“C”
{
void某些需要回调的函数(void(*FuncPtr)(int-Width,int-Height))
{
FuncPtr(80,20);
}
}
类TTerm
{
公众:
国际信息o;
int-WinchFds[2];
整数宽度;
内部高度;
TTerm()
{
一些需要回调(OnResizeCallback)的函数;
}
静态void OnResizeCallback(整型宽度、整型高度)
{
//设置此->宽度和此->高度
}
};
int main()
{
TTerm术语;
}
如果C
回调是您的,或者您可以更改它,您可以传递一个指向类实例的指针,并调用静态方法中的某个成员函数:
extern "C"
{
void SomeCFunctionThatRequireCallback(void * ptr, void (*FuncPtr)(void *, int, int))
{
FuncPtr(ptr, 80, 20);
}
}
TTerm()
{
SomeCFunctionThatRequireCallback(this, OnResizeCallback);
}
static void OnResizeCallback(void * ptr, int Width, int Height)
{
// Set this->Width and this->Height
TTerm * instance = (TTerm*)ptr;
instance->Width = Width;
instance->Heght = Height;
}
您还可以将int作为引用传递。但是,同样,您需要修改回调签名
如果无法更改回调签名,则必须控制谁调用回调,并在静态方法中执行某些操作
您可以使用另一个类中的信号量来保护回调,并从中获取所需的数据
(非编译示例。)
RequiredCallback的某个函数是您的吗?不,这不是为什么?因为如果无法更改回调签名,则无法直接执行所需操作。无法更改静态方法中的非静态成员。但你到底有什么问题?这正是我需要的。非常感谢!
TTerm() {
SomeCFunctionObject & obj = SomeCFunctionObject.getInstance();
obj.setCaller (this);
obj.doCallback ();
Width = obj._width;
Height = obj._height;
}
class SomeCFunctionObject {
public:
int _width;
int _height;
static SomeCFunctionObject & getInstance () {
static SomeCFunctionObject obj;
return obj;
}
static void OnResizeCallback(int Width, int Height)
{
SomeCFunctionObject & obj = SomeCFunctionObject.getInstance();
obj._width = Width;
obj._height = Height;
// free semaphore
}
void setCaller (void * using) {
// get semaphore
_using = using
}
void doCallback () {
SomeCFunctionThatRequireCallback(OnResizeCallback);
}
private:
void * _using;
SomeCFunctionObject () {}
};