使用功能指针作为成员功能的代理

时间:2019-09-23 14:08:08

标签: c++ function-pointers member-function-pointers

假设这样一个类:

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::saySomething实例的情况下才能调用Speaker 。因此,相应对象的可用性应该不是问题,但仍然无法弄清楚如何分配该指针。

我唯一能想到的解决方案是添加一个公共virtual Speaker::doSaySomething函数,该函数的实现将调用该函数指针(为了防止误用,该指针将不再是公共的),并且可以被覆盖ConstantSpeaker改为呼叫ConstantSpeaker::doSpeak()
有解决这个问题的另一种方法吗?

1 个答案:

答案 0 :(得分:2)

另一种解决方案是仅使用标准std::function<void()>,然后仍可以将其声明为public。

此外,您可以使用指向成员函数的指针来代替裸函数指针,但是在基类中使用它时要注意切片。

但是,我认为,最简单的方法就是使用virtual函数,就像您提到的那样。

也许可以进一步介绍您的情况?您要解决什么问题?