指向抽象类的指针向量

vector of pointers to abstract class

本文关键字:指针 向量 抽象类      更新时间:2023-10-16

我正在尝试在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()时,确保它们仍然在那里。