当观察者是一个类时,我无法获取错误类型的观察者

时间:2019-03-20 22:11:06

标签: c++ observer-pattern nios

使用针对C ++的预先编写的Obvserver设计模式代码时遇到问题。在attach方法中,当我将Observer类型声明为类时,它无法解析。谁能帮我解决这个问题?在此方法中,views.push_back也存在另一个问题。它抛出错误“无效的参数,候选者为push_back(Observer * const&)无效”。我是C ++的新手,对这些错误不太了解。

#include <iostream>
#include <vector>
using namespace std;

class Subject {
    // 1. "independent" functionality
    vector < class Observer * > views; // 3. Coupled only to "interface"
    int value;
  public:
    void attach(Observer *obs) {
        views.push_back(obs);
    }
    void setVal(int val) {
        value = val;
        notify();
    }
    int getVal() {
        return value;
    }
    void notify();
};

class Observer {
    // 2. "dependent" functionality
    Subject *model;
    int denom;
  public:
    Observer(Subject *mod, int div) {
        model = mod;
        denom = div;
        // 4. Observers register themselves with the Subject
        model->attach(this);
    }
    virtual void update() = 0;
  protected:
    Subject *getSubject() {
        return model;
    }
    int getDivisor() {
        return denom;
    }
};

void Subject::notify() {
  // 5. Publisher broadcasts
  for (int i = 0; i < views.size(); i++)
    views[i]->update();
}

class DivObserver: public Observer {
  public:
    DivObserver(Subject *mod, int div): Observer(mod, div){}
    void update() {
        // 6. "Pull" information of interest
        int v = getSubject()->getVal(), d = getDivisor();
        cout << v << " div " << d << " is " << v / d << '\n';
    }
};

class ModObserver: public Observer {
  public:
    ModObserver(Subject *mod, int div): Observer(mod, div){}
    void update() {
        int v = getSubject()->getVal(), d = getDivisor();
        cout << v << " mod " << d << " is " << v % d << '\n';
    }
};

1 个答案:

答案 0 :(得分:0)

问题在于您声明类的顺序。类Subject使用类Observer,但是之后声明了Observer,因此当编译器尝试编译Subject时,并不知道Observer是什么。但是,由于Subject也使用Observer,所以不能仅仅改变声明的顺序。

这个难题的答案是前向声明Observer,因此至少编译器知道Observer是一个类,即使它不太了解它。在您的class Observer;定义之前添加class Subject。 您还可以从向量声明中删除单词class

class Observer;

class Subject {
    // 1. "independent" functionality
    vector < Observer * > views; // 3. Coupled only to "interface"
    ...