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 () {}

};