Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对从外部库派生的对象使用RTTI_C++_Design Patterns_Rtti - Fatal编程技术网

C++ 对从外部库派生的对象使用RTTI

C++ 对从外部库派生的对象使用RTTI,c++,design-patterns,rtti,C++,Design Patterns,Rtti,我正在使用一个外部库,需要创建一个观察者模式,其中观察者从属于该库的对象派生。我不想更改库中的基类,同时我必须使用指向此不可更改基类的引用/指针列表。在此基础上,库构建了一个对象列表,我需要从中筛选适合作为观察者的对象 我写的代码大致相当于: #include <iostream> #include <vector> #include <memory> // This class is from an external library which I don

我正在使用一个外部库,需要创建一个观察者模式,其中观察者从属于该库的对象派生。我不想更改库中的基类,同时我必须使用指向此不可更改基类的引用/指针列表。在此基础上,库构建了一个对象列表,我需要从中筛选适合作为观察者的对象

我写的代码大致相当于:

#include <iostream>
#include <vector>
#include <memory>

// 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<std::shared_ptr<Observer>> 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<std::shared_ptr<BaseFromLibrary>> list{
        std::make_shared<BaseFromLibrary>(), std::make_shared<Observer>()};
    Subject s;

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

    s.notifyObervers();
}
#包括
#包括
#包括
//这个类来自一个我不想查的外部库
类BaseFromLibrary{
公众:
虚拟~BaseFromLibrary(){}
};
类BaseofOfOfOfObserver{
公众:

void notify(){std::cout您的问题归结为拥有一个基指针序列,并且只想使用序列中属于特定派生类型的元素

dynamic\u cast
当然有效,但在这种情况下,这是不必要的。如果要将所需指针保存在单独的容器中,则不需要在包含其他指针的容器中查找它们

std::vector<Observer *> observers {new Observer()};
当然,如果这就是您要做的,那么您可以首先使用
s.observators
作为观察者的原始容器


作为旁注,您的示例程序会泄漏内存。避免手动内存管理以防止出现这些情况。

如果我理解正确,您建议从我的示例中拆分
list
。我可能忘了强调这也是我无法做到的。库自行构造该列表,我不想这样做干扰那个进程。我会尝试编辑那个。关于内存泄漏的观点。
std::vector<BaseFromLibrary *> all {new BaseFromLibrary()};
all.reserve(all.size() + observers.size());
all.insert(all.end(), observers.begin(), observers.end());
s.observers.insert(observers.begin(), observers.end());