【发布时间】: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