当前位置:  开发笔记 > 编程语言 > 正文

将RTTI与从外部库派生的对象一起使用

如何解决《将RTTI与从外部库派生的对象一起使用》经验,为你挑选了0个好方法。

我正在使用外部库,需要创建一个观察者模式,其中观察者来自属于该库的对象.我不想从库中更改基类,同时我必须使用这个不可更改的基类的引用/指针列表.除此之外,库构造了对象列表,我需要从中筛选出适合观察者的对象.

我写的代码大致相当于:

#include 
#include 
#include 

// This class is from an external library which I don't want to chagne
class BaseFromLibrary {
  public:
    virtual ~BaseFromLibrary() {}
};

class BaseOfObserver {
  public:
    void notify() { std::cout << "What-ho!\n"; };
};

class Observer : public BaseFromLibrary, public BaseOfObserver {};

class Subject {
  public:
    std::vector> observers;
    void notifyObervers() {
        for (auto &o : observers)
            (*o).notify();
    }
};

int main() {
    // This list is constructed by the library and I cannot interfere with that
    // process
    std::vector> list{
        std::make_shared(), std::make_shared()};
    Subject s;

    for (auto &e : list)
        if (std::dynamic_pointer_cast(e) != nullptr)
            s.observers.push_back(std::dynamic_pointer_cast(e));

    s.notifyObervers();
}

然后我使用" BaseOfObserver添加主题意识"到我的其他派生类型.这样我就不必为我想要实现的每个特定观察者重复一个if语句.

它似乎工作正常,但这是一个设计错误?有没有更好的方法来构建没有RTTI机制的观察者列表并且不干扰库类?

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有