当观察者是一个类时,无法解析我得到错误类型观察者

问题描述 投票:0回答:1

我在使用预先编写的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';
    }
};
c++ observer-pattern nios
1个回答
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"
    ...
© www.soinside.com 2019 - 2024. All rights reserved.