假设我有一个继承自 Parent 类的 Child 类。这两个类都需要能够将同一方法的函数指针发送给 API,我们称它为 foo()。
我不认为我可以使 foo() 成为成员函数,因为调用回调的进程需要有一个 Child 或 Parent 的对象来调用它。我也不认为我可以使 foo() 成为静态成员函数,因为可能有多个 Parent of Child 实例。
在这种情况下,放置 foo() 的最干净的地方是什么?它是否应该进入自己的文件并拥有自己的命名空间,并将#include 包含在父子对象中? foo() 是否应该仅在 Parent 中意味着 Child 需要包含 Parent.cpp 并转发声明 foo()?
感谢任何见解!
最佳答案
如果您的 API 需要一个指向函数的指针,您只能给它一个静态函数或在任何类之外定义的普通函数。如果您稍后需要此函数调用您的一个对象上的方法,您需要 API 允许您传递一些东西(通常是一个void *
)。如果您可以向 API 传递函数指针和一个void *
,您就赢了:只需向它传递一个指向 Parent 或 Child 类对象的指针以及指向中继功能。
假设 API 将调用 int (*callback)(void *param/* other params...*/)
您定义如下内容:
int myCallback(void* param /* other params...*/) {
Parent *parent = static_cast<Parent *>(param);
return parent->myMethod(/* other params...*/);
}
那样:
- API 只知道指向函数的普通指针和不透明的
void *
- 您可以在您的类中声明普通方法(甚至虚方法)
- relay 函数由 API 调用,然后调用对象的方法
关于c++ - 如果基类和派生类都需要使用相同的函数,回调函数应该去哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32837122/