指向抽象类的指针向量
vector of pointers to abstract class
我正在尝试在c++中实现观察者模式。我试图做的是用一个纯虚方法声明一个观察者接口:notify(),然后让观察者实现/派生该接口。此外,我想保留一个指向被观察类中所有观察类的指针向量,这样我就可以对每个观察类调用notify()。遗憾的是,我在指针向量上遇到了一些麻烦。
这是观察者接口:
class LocationEstimateObserver {
public:
virtual void notify() = 0;
};
我有两个不同的类实现这个接口。因此,两者都实现了notify()方法。
这里是我观察到的类:
class Simulator {
public:
Simulator();
virtual ~Simulator();
void registerListener(LocationEstimateObserver& observer){observers_.push_back(&observer); };
void notifyObservers();
private:
std::vector<LocationEstimateObserver*> observers_;
};
和观察者类(实现观察者接口):
void InMapsEngine::startSimulation() {
Simulator sim();
sim.registerListener(*this);
}
和Simulator.cpp文件:
void Simulator::notifyObservers() {
for (unsigned int i = 0; i < observers_.size(); i++) {
observers_.at(i)->notify();
}
}
现在,当我运行上面的代码,我得到一个分段错误。有人能指出我做错了什么吗?我对c++还是个新手。
编辑:我刚刚做了一个奇怪的发现:当我调用observers_size()它返回一个非常奇怪的负数,所以for循环失败。
为什么不添加LocationEstimateObserver子类的实例,而不是有一个函数向量,当发生某些事情时将被通知?:
类似:
class Simulator {
public:
Simulator();
virtual ~Simulator();
void registerListener(const function<void()>& observer ) {observers_.push_back(observer); };
void notifyObservers();
private:
std::vector<function<void()>> observers_;
};
void observer1()
{
}
int main()
{
Simulator sim;
sim.registerListener(observer1);
}
和Simulator.cpp文件:
void Simulator::notifyObservers() {
for (auto& observer : observers_)
observer();
}
您保留了一个指向对象的指针向量,这些对象可以在注册后立即删除。当你调用Simulator::notifyObservers()
时,确保它们仍然在那里。
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何更改唯一指针向量的可见性
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 包含指向其他结构的指针向量的结构
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 初始化可变数据结构中的共享指针向量
- 指向具有 decltype 的函数的指针向量
- push_back指向指针向量的指针
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 我可以做些什么来改进指针向量中的此搜索?
- 指向指针排序向量的指针向量的 C++ 向量
- 初始化用户定义类的指针向量
- 函数无法识别我在C++传递节点指针向量?
- 如何声明指向类对象的指针向量?
- 指向结构的指针向量的元素具有相同的地址
- 删除指向抽象类的指针向量
- 当我返回指向结构的指针向量时出现段错误
- 用基于范围的for循环填充指针向量