gpt4 book ai didi

C++,函数指针与观察者模式

转载 作者:太空狗 更新时间:2023-10-29 20:35:43 25 4
gpt4 key购买 nike

几年前,在我了解 C++ 之前,我曾与一位经验丰富的程序员同事讨论创建事件系统等问题。他似乎强调需要传递函数指针,以便可以进行回调以通知类状态更改等。

然而,最近每当我需要实现某种事件系统时,我只是构造一个伪接口(interface)类,继承它并使用订阅者/观察者模式来覆盖方法和分发事件。

前几天我在想,到目前为止,我很少需要使用函数指针,当然不需要用于上述情况。我真正必须使用函数指针的唯一一种情况是在与其他人的 .dll 交互时明确要求传递一个函数指针。

什么时候应该使用函数指针而不是订阅者/观察者模式?

使用其中一种做法是好还是坏? (大概在某些情况下,观察者模式并不比函数指针好)。

有人可以分享一些见解吗?在这方面获得更多经验会很好吗? (上述同事已经跳槽到另一家公司,我们已经失去联系)。我一直在为这个问题绞尽脑汁,想不出什么时候使用观察者模式和界面会更整洁。

谢谢!

我经常发现自己写的一个类的例子(没有测试就写,完全脱离了我的头脑,可能实际上不起作用):

class NotifierListener {

friend class Notifier;
private:
vector<NotifierListener*> mListeners;

protected:
void subscribe(NotifierListener* _subscriber) {mListeners->push_back(_subscriber);}
virtual void onNotification();
}

class Notifier : public NotifierListener {

private:
void doSomethingAndNotify() {

...
if (mListeners.size() > 0) {
for (int i = 0; i < mListeners.size(); ++i) {

mListeners[i]->onNotification();
}
}

}
}

class Something : public NotifierListener {

Something() { subscribe(this); }

void onNotification() {

cout << "I got notified\n" << endl;
}
}

最佳答案

函数指针的效率更高一些。您现在将指针传递给接口(interface)。接口(interface)通常*包含一个指向虚表的指针。而那个 vtable 又包含函数指针。这是 3 个间接级别,引用位置很差。

[*] 其他实现是可能的,但具有类似的开销。

关于C++,函数指针与观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41484277/

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