我正在尝试用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循环失败。存在问题。答案 0 :(得分:0)
您保留一个指向对象的指针向量,这些对象可能在注册后立即被删除。当你致电Simulator::notifyObservers()
时,请确保他们仍然在那里。
答案 1 :(得分:0)
为什么不添加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();
}