Observer와 Subject의 두 클래스와 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();
}
}
}
...
};
, 나는 또한 주제를 가지고 주제에
나는 관찰자 클래스에 대한 포인터의 벡터를 가지고
Subject 클래스를 선언하기 전에 Observer 클래스에 대한 forward 선언을 추가했습니다.
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;
^
내가 주제 클래스, 내가 앞으로 Obsever 클래스 선언에서 관찰자에 대한 포인터의 벡터를 가지고 옵저버 클래스는 Subect에 대해 알고, 왜 내가 여전히 오류가 있습니까 : 그러나 나는 컴파일 오류는 무엇입니까?
실제로 클래스의 기능을 사용하려면 * 전체 정의가 필요합니다. forward 선언문 만 가지고 있다면 컴파일러는 실제로 어떤 멤버 함수를 가지고 있는지 어떻게 알 수 있습니까? –
IMO, 같은 문제에 대해 "중복 된 질문"과 두 가지 질문이 다릅니다. 해결책을 알고있는 프로그래머는 답이 비슷하다는 것을 즉시 알게 될 것이지만 새로운 프로그래머는 그렇지 않을 것입니다. 아마도 그 이유는 그가 아직 답을 읽지 않고 묻는 이유 일 것입니다. –