订阅多个同基类发布者时的重复基类编译错误解决方案求助
订阅多个同基类发布者时的重复基类编译错误解决方案求助
各位好,我最近在实现一个简单的发布-订阅模式时遇到了编译问题,想请教下怎么实现我的需求。
我想要让一个Handler类同时订阅DriverA和DriverB这两个发布者,并且能分别重载对应发布者的Notify方法,让两个发布者触发通知时,各自执行对应的处理逻辑。
我先写了这样一段代码:
#include <iostream> #include <vector> class Subscriber { public: virtual void Notify(float f) = 0; }; class Publisher { public: constexpr void AddSubscriber(Subscriber* sub) { subs_.push_back(sub); }; void Notify(float v) { for (auto& s : subs_) { if (s) { s->Notify(v); } } } private: std::vector<Subscriber*> subs_; }; class DriverA : public Publisher { public: using Subscriber = ::Subscriber; void Activate(float f) { Notify(f); } }; class DriverB : public Publisher { public: using Subscriber = ::Subscriber; void Activate(float f) { Notify(f); } }; class Handler : public DriverA::Subscriber, public DriverB::Subscriber { public: constexpr Handler(DriverA& da, DriverB& db) { da.AddSubscriber(this); db.AddSubscriber(this); } float Val() const { return val_; } private: void DriverA::Subscriber::Notify(float v) override { val_ = v; std::cout << "valA:" << v << std::endl; } void DriverB::Subscriber::Notify(float v) override { val_ = v; std::cout << "valB:" << v << std::endl; } float val_{}; }; int main() { DriverA da; DriverB db; Handler h{ da, db }; da.Activate(3.14f); db.Activate(2.71f); return 0; }
但编译时直接报错了,错误信息是:
main.cpp:37:61: error: duplicate base type ‘Subscriber’ invalid
37 | class Handler : public DriverA::Subscriber, public DriverB::Subscriber {
我原本以为如果两个发布者是不同类型,这样的写法能行,但现在发现DriverA::Subscriber和DriverB::Subscriber其实都是同一个基类::Subscriber,所以触发了重复基类的问题。
想请教大家:有没有办法实现我的需求——让Handler同时订阅这两个发布者,并且分别重载每个对应的Notify方法呢?
内容来源于stack exchange
相关产品推荐
相关产品推荐

