如果基类和派生类都需要使用同一个函数,回调函数应该去哪里?
Where should callback function go if both base and derived class need to use the same function?
假设我有一个继承自类Parent的类Child。两个类都需要能够发送相同方法的函数指针,让我们称之为foo(),给API。
我不认为我可以使foo()成为成员函数,因为调用回调的进程需要有一个Child或Parent的对象来调用它。我也不认为我可以使foo()一个静态成员函数,因为可能有多个Parent of Child的实例。
在这种情况下放置foo()最干净的地方是什么?它是否应该进入自己的文件并拥有自己的命名空间,并在Parent和Child中同时包含#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 *
- 你可以在你的类中声明普通方法(甚至是虚拟方法)
- 中继函数由API调用,并依次调用对象上的方法
我可以理解为什么Foo()不能是一个静态函数。可能是不同的Child和Parent对象想要有不同的Foo()函数。
考虑使用接口。不要发送指向方法的指针,而要发送指向拥有Foo()方法的接口的引用。
我已经好几年没有编程c++了,所以我的c++有点生疏了,如果是c#请原谅我。我想你会明白我的意思的。
public interface IMyInterface
{
void Foo();
}
public class Parent : IMyInterface
{
public virtual void Foo()
{
DoSomething();
}
}
public class Child : Parent, IMyInterface
{
public override void Foo()
{
DoSomethingElse()
// if needed call Base.Foo();
}
}
用法:假设你有一个对象需要调用另一个对象的Foo。唉,它不知道对象是父对象还是子对象。幸运的是,它不需要知道它是什么,它只需要知道它有一个函数Foo。这是通过承诺对象将实现IMyInterface
实现的public class FooCaller
{
private void CallFoo(IMyinterFace fooToBeCalled)
{
fooToBeCalled.Foo();
}
}
所以FooCaller不知道footobeccalled是Parent还是Child。它只知道if有一个函数Foo()。
使用接口的好处是,如果对象之间没有关系,也可以使用接口
class Uncle : IMyInterface
{
public void Foo() {...}
}
父类既不是父类也不是子类,但它仍然可以被FooCaller使用。
使用接口而不是基类使您有机会专注于执行任务所需的最小函数集。
- 以特征类型作为参数的泛型函数回调
- C# DllImport 调用非托管C++函数回调
- 为什么模板参数推导失败,std::函数回调的可变参数模板参数?
- std::包含 std::函数回调的多个包装器的向量不起作用
- 如何设置对类的私有函数的函数回调?
- 如何使用 c++11 函数回调声明多个模板参数
- sqlite3 更改函数回调参数 void* not用于 int* C++
- 如何知道 sqlite 中的函数"回调"是否返回了一些东西?
- Windows表单如何使用其他函数回调图表信息
- 如何在 c++ 结构中的 void* 变量中调用存储函数(回调)
- 将成员函数作为标准函数回调
- C++ 使用成员函数回调实现按钮
- std::函数回调,参数采用观察者模式(寄存器主题上的占位符)
- 使用可变参数模板从 Lua 函数回调 (C api) 中提取参数
- 在C++中使用派生类的静态方法作为函数回调
- 将libuv与函数结构一起使用,而不是函数回调
- 如何将函数回调传递给类成员
- c++类成员函数回调
- C++函数回调:无法从成员函数转换为函数签名
- 如何编写一个通用函数回调测试类