gpt4 book ai didi

c++ - 如何将方法指针传递给结构(在 C/C++ 中)?

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:30 26 4
gpt4 key购买 nike

我有一个 C++ 类,它有一个指针,表示类似于此类的 C 接口(interface)。实际上一切都很好,除了一件事:我不能在 MyClass 构造函数中将方法指针传递给这个结构。示例实现如下所示:

//pure C code
typedef int CI_AFunction(CI_Struct*);

typedef struct CI_MyClass //C Interface of MyClass
{
CI_AFunction* func;
}CI_MyClass;



//C++ code
class MyClass
{
private:
CI_AFunction* _func;
CI_MyClass* ptrCI_MyClass;

public:
MyClass(): _func(**WHAT TO PUT IN HERE TO MAKE IT POINT TO MyFunc?**)
{
ptrCI_MyClass= new CI_MyClass;
ptrCI_MyClass->func=_func;
}

int MyFunc(CI_Struct* str)
{
// do something
return 0;
}

CI_MyClass* GetCInterface()
{
return ptrCI_MyClass;
}
};


//more or less usage looks somewhat like this:
CI_ptr->func(CI_StructInstancePtr); //in different C file

如何解决?我不确定这种方法是否可行,但是即使不优雅,以这种方式解决也是最方便的。这个“C 接口(interface)”应该只是向 C 代码揭示这个功能,因此我不会尝试制作整个良好的编程实践 C API。

编辑:谢谢大家的帮助。你的提示真的让我解决了问题。我创建了一个单例,对于某事的经理来说这不是一个坏方法。现在我有了静态函数,一切正常。谢谢!

最佳答案

指针不兼容,您可以存储指针但不能调用它您要做的是将 stdcall 转换为 thiscall,它们的工作方式不同。我在这里看到 2 种可能的解决方法。

  1. 如果 MyFunc 被标记为 static 它的行为与 stdcall 相同,但是你不能在方法中使用 this 并且你必须使用 CI_Struct* str 代替。

    当方法被标记为静态时,您可以将其转换为常规的 c 函数

    _func ( (CI_AFunction) &MyClass::MyFunc )
  2. 你必须在它们之间架起“桥梁”。 C 接口(interface)将以某种方式需要调用一个能够对对象运行调用的函数(C++ish)。有点像

    int adapter( int (MyClass::*pMethod)(CI_Struct*), MyClass *obj )
    {
    return obj->pMethod(obj->GetCInterface()); /* or 3rd param that is the struct */
    }

选项 1 似乎是您正在寻找的,因为您已经传递了据我所知应该包含所有数据的结构。

关于c++ - 如何将方法指针传递给结构(在 C/C++ 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23214187/

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