【发布时间】:2017-06-18 09:36:15
【问题描述】:
我有两个类 Observer 和 Subject 以及 ObserverA、ObserverB,它们扩展了 Observer(用于实现 Observer DP)。
在主题中,我有一个指向观察者类的指针向量:
class Subject {
std::vector<Observer*> obs;
int state;
public:
Subject(): state(0) {}
void notifyAll() {
for(std::vector<Observer*>::iterator it = obs.begin(); it != obs.end(); it++)
{
(*it)->update();
}
}
}
...
};
在观察者中,我也有一个主题:
class Observer {
protected:
Subject subj;
public:
virtual void update() {};
};
ObserverA、ObserverB 类似:
class ObserverA: public Observer {
public:
ObserverA(Subject s) {
subj = s;
s.attach(this);
}
virtual void update() {
std::cout << "Update A, state subj: " << subj.getState() << std::endl;
}
};
在声明 Subject 类之前,我为 Observer 类添加了前向声明。但是我收到编译错误:
Observer.h: In member function ‘void Subject::notifyAll()’:
Observer.h:27:17: error: invalid use of incomplete type ‘class Observer’
(*it)->update();
^
Observer.h:7:7: error: forward declaration of ‘class Observer’
class Observer;
^
我有一个指向 Observer 的指针向量,在 Subject 类中,我转发声明的 Obsever 类并且 Observer 类知道 Subect,为什么我仍然有错误?
【问题讨论】:
-
如果你想真正使用一个类的功能,你需要它的完整定义。如果你只有一个前向声明,编译器怎么会知道它有哪些成员函数?
-
IMO,它是不同的“重复问题”和关于同一问题的两个问题。知道解决方案的程序员会立即知道答案是相似的,但新程序员不会,这可能就是他提出问题但尚未阅读答案的原因。
标签: c++