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());