【问题标题】:im getting an error type observer could not be resolved when observer is a class当观察者是一个类时,我得到一个错误类型的观察者无法解决
【发布时间】:2019-03-20 22:11:06
【问题描述】:

我在使用预先编写的 C++ 观察服务器设计模式代码时遇到问题。在 attach 方法中,当我将类型 Observer 声明为类时,无法解析它。谁能帮我解决这个问题?在这种方法中,views.push_back 也有另一个问题。它抛出错误“无效的参数,候选者是 void 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';
    }
};

【问题讨论】:

  • 您可能希望在class Subject 定义之上添加Observer 的前向引用。
  • 这是什么意思?抱歉,我对此比较陌生
  • 如果我切换它们,那么我会在 Observer 中得到同样的结果。反正有这个吗?
  • 前向声明只是放在class Subject { ... 定义上方的class Observer; 行。这基本上告诉编译器将Observer 视为类类型......编译器将不知道类型的大小或能够访问它的成员(直到它看到类的定义),但它将知道指向 Observer 类的指针的大小。因此,您可以在没有完整的 Observer 类定义的情况下定义一个包含 Observer * 的向量。

标签: c++ observer-pattern nios


【解决方案1】:

问题在于您声明类的顺序。 Subject 类使用 Observer 类,但 Observer 是在之后声明的,因此当编译器尝试编译 Subject 时不知道 Observer 是什么。但是,由于Subject 也使用Observer,因此您不能只切换声明的顺序。

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

class Observer;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2021-04-13
    • 2019-08-22
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多