指向抽象类的向量

时间:2014-03-09 20:41:42

标签: c++ observer-pattern stdvector

我正在尝试用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循环失败。存在问题。

2 个答案:

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

 }