Ошибка компиляции при попытке зарегистрировать наблюдателя в шаблоне предметного класса - PullRequest
0 голосов
/ 22 августа 2011

Я пытаюсь реализовать шаблон наблюдателя с помощью шаблона предметного класса. Наблюдатели не должны (должны) знать тип субъектов, поэтому я создал интерфейс для метода присоединения без этого типа. Это моя реализация:

SubjectInterface.h

#ifndef SUBJECTINTERFACE_H_
#define SUBJECTINTERFACE_H_
#include <list>
#include "Observer.h"
// Template-independant interface for registering observers
class SubjectInterface
{
public:
  virtual void Attach(Observer*) = 0;
}; // class SubjectInterface
#endif // SUBJECTINTERFACE_H_

Subject.h

#ifndef SUBJECT_H_
#define SUBJECT_H_
#include <list>
#include "Observer.h"
#include "SubjectInterface.h"
template <class T>
class Subject : public SubjectInterface
{
public:
  Subject();
  ~Subject();
  void Attach(Observer*);
private:
  T                        mValue;
  std::list<Observer*> mObservers;
}; // class Subject
#include "Subject.cpp"
#endif // SUBJECT_H_

Subject.cpp

template <class T>
Subject<T>::Subject()
{
}
template <class T>
Subject<T>::~Subject()
{
}
template <class T>
void Subject<T>::Attach(Observer* test)
{
  mObservers.push_back(test);
}

Observer.h

#ifndef OBSERVER_H_
#define OBSERVER_H_
#include "SubjectInterface.h"
#include <iostream>
class Observer
{
public:
  Observer(SubjectInterface* Master);
  virtual ~Observer();
private:
  SubjectInterface* mMaster;
}; // class Observer
#endif // OBSERVER_H_

Observer.cpp

#include "Observer.h" // include header file
Observer::Observer(SubjectInterface* Master)
{
  Master->Attach(this);
}
Observer::~Observer()
{
}

Когда я компилирую это с помощью gcc 4.3.4, я получаю следующее сообщение об ошибке:

SubjectInterface.h:10: error: ‘Observer’ has not been declared

Я не понимаю этого, потому что Наблюдатель включен только несколькими строками выше. Когда я меняю тип указателя с Observer * на int *, он компилируется. Я предполагаю, что есть проблема с темой шаблона и не шаблонным интерфейсом к нему, но это не то, что говорит мне gcc, и это не проблема при использовании int *.

Я искал шаблон / наблюдателя, но то, что я нашел (например, Реализация шаблона субъекта / наблюдателя с шаблонами ), не совсем то, что мне нужно.

Может кто-нибудь сказать мне, что я сделал не так или как я могу вызвать шаблонный метод attach от не шаблонного наблюдателя?

Ответы [ 2 ]

1 голос
/ 22 августа 2011

У вас есть круговая цепочка включения, SubjectInterface.h включает в себя Observer.h, который, в свою очередь, включает SubjectInterface.h.

Это означает, что охранники включения не дадут Observer быть видимым.Чтобы исправить это, вместо этого объявите Observer.

// SubjectInterface.h
#ifndef SUBJECTINTERFACE_H_
#define SUBJECTINTERFACE_H_
#include <list>
class Observer; //Forward declaration
// Template-independant interface for registering observers
class SubjectInterface
{
public:
  virtual void Attach(Observer*) = 0;
}; // class SubjectInterface
#endif // SUBJECTINTERFACE_H_
0 голосов
/ 22 августа 2011

У вас круговая зависимость;Observer.h включает SubjectInterface.h и наоборот.Вам нужно будет прервать это с помощью предварительного объявления .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...