ObserverとSubjectの2つのクラスObserverA、ObserverBがObserver(Observer DPを実装するために)を拡張しています。似前方宣言不完全型、再帰
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;
}
};
オブザーバーで
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();
}
}
}
...
};
、私はまた、件名を持っている:件名で
私はObserverクラスへのポインタのベクトルを持っています
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;
^
私はオブザーバーへのポインタのベクトルを持って、Subjectクラスでは、私は前方にオブザーバークラスとObserverクラスは、私はまだエラーを持っていない理由Subect、知っていると宣言しましたか?
あなたが実際に* *クラスの機能を使用できるようにしたい場合は、あなたがそれの完全な定義を必要としています。前方宣言しかない場合、コンパイラはどのメンバ関数に実際にどのようなことがあるかを実際に知っていますか? –
IMOでは、同じ問題について「重複した質問」と2つの質問が異なります。解決策を知っているプログラマはすぐに答えを知るでしょうが、新しいプログラマーはそうしないでしょう。なぜなら、彼はなぜ答えを尋ねているのですか? –