使用函数指针作为成员函数的代理
Use function-pointer as proxy to member-function
假设一个这样的类:
class Speaker {
public:
void (*saySomething)();
}
关键是我们可以实例化该类并调用存储的函数指针,以便让它说些什么(无论结果是什么(。这种方法的背景是让实际函数驻留在共享库中,Speaker
充当某种包装类(函数在库中解析,指针分配给类中的变量(。
现在考虑我们有另一个扩展Speaker
的类:
class ConstantSpeaker : public Speaker {
protected:
std::string message;
void doSpeak();
}
该方法的实现如下所示:
ConstantSpeaker::doSpeak() {
std::cout << message << std:endl;
}
现在我想以某种方式分配saySomething
指针,以便以某种方式将呼叫重新路由到ConstantSpeaker::doSpeak()
。但是,这不可能直接实现,因为doSpeak()
是成员函数,saySomething
是指向非成员函数的指针。
我的另一个想法是创建doSpeak()
作为ConstantSpeaker
的朋友功能。然后指针赋值工作正常,但现在doSpeak()
需要将实际消息作为参数保存的对象才能访问消息。
对我来说,似乎应该有一种(或多或少(直接的方式来做到这一点,因为我只能在手头有Speaker
实例时调用Speaker::saySomething
。因此,相应对象的可用性应该不是问题,但我仍然无法弄清楚如何分配该指针。
我能想到的唯一解决方案是添加一个公共virtual Speaker::doSaySomething
函数,其实现将调用函数指针(然后不再公共以防止误用(,并且可以被ConstantSpeaker
覆盖以调用ConstantSpeaker::doSpeak()
代替。
这个问题有没有其他解决方案?
另一种解决方案是使用标准std::function<void()>
,然后仍然可以将其声明为公共。
此外,您可以使用指向成员函数的指针代替裸函数指针,但在基类中使用切片时请注意切片。
但是,我认为,最微不足道的方法就是使用virtual
函数,就像你提到的。
也许多说说你的背景?您要解决的问题是什么?
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针