У меня небольшие проблемы с шаблоном наблюдателя. У меня есть класс напитков, в котором отлично используется декоратор.Я пытаюсь внедрить наблюдателя, чтобы в этом случае наблюдатель (скажем, мобильный телефон / текстовое сообщение) узнал, когда будет выполнен заказ.я не буду включать классы напитков / декораторов, так как они работают нормально.
В основном я собирался сделать что-то вроде этого:
Subject mySubject = new Subject();
Observer myObserver1 = new Observer1();
Observer myObserver2 = new Observer2();
// register observers
mySubject.Register(myObserver1);
mySubject.Register(myObserver2);
mySubject.Notify("message 1");
mySubject.Notify("message 2");
У меня есть предметный класс, наблюдатель, класс поведения телефонаи класс cellphone1, cellphone2 ..
Вот класс объекта
#ifndef _SUBJECT_
#define _SUBJECT_
//#include "Starbuzz.h"
//#include "Starbuzz2.h"
#include "Observer.h"
#include <list>
namespace CoffeeHouse {
namespace Observers {
class Subject {
private:
std::list< Observer* > observers;
public:
Subject();
~Subject();
void Subject::Register(Observer observer)
{
//if (!observers.(observer))
//{
observers.insert(observer);
}
//}
//void Unregister(Observer observer)
//{
// if observer is in the list, remove
//if (observers.Contains(observer))
//{
//observers.Remove(observer);
//}
//}
void Notify(std::string message)
{
//need loop
Observer observer;
observer.update(message);
}
//}
//}
//void Subject::registerObserver( Observer* o ) { assert( o );
//_observers.push_front(o);
//}
//void Subject::removeObserver( Observer* o ) { assert( o );
// _observers.remove(o);
//}
//void Subject::notifyObservers() const {
//for( std::list< Observer* >::iterator iterator = _observers.begin(); _observers.end() != iterator; ++iterator ) {
//Observer* observer = *iterator;
//observer->update(message);
//}
//}
};
} // namespace Observer
}
#endif
Вот класс наблюдателя
#ifndef _OBSERVER_
#define _OBSERVER_
#include <string>
namespace CoffeeHouse {
namespace Observers {
class Subject;
class Observer {
//public: virtual ~Observer() = 0;
public: virtual void Update(std::string message) = 0;
};
Вот класс поведения телефона
#ifndef _PHONEBEHAVIOR_
#define _PHONEBEHAVIOR_
namespace CoffeeHouse {
namespace Observer {
class PhoneBehavior {
public: virtual void Update() const = 0;
};
protected: virtual ~PhoneBehavior() = 0 {
};
};
} // namespace Observer
} //
вот мобильный телефон 1
#ifndef _CELLPHONE1_
#define _CELLPHONE1_
namespace CoffeeHouse {
namespace Observer {
include<iostream>
class CellPhone1: public Observer, public PhoneBehavior {
public:
CellPhone1();
~CellPhone1();
virtual void Update(std::string message)
{
std::cout << "CellPhone1: " << message;
}
};
} // namespace Observer
} //
#endif
вот ошибки, которые я получаю ..
error C2259: 'CoffeeHouse::Observers::Observer' : cannot instantiate abstract class
1> due to following members:
1> 'void CoffeeHouse::Observers::Observer::update(std::string)' : is abstract
see declaration of 'CoffeeHouse::Observers::Observer::update'
error C2661: 'std::list<_Ty>::insert' : no overloaded function takes 1 arguments
with[_Ty=CoffeeHouse::Observers::Observer *
error C2259: 'CoffeeHouse::Observers::Observer' : cannot instantiate abstract class
due to following members:
'void CoffeeHouse::Observers::Observer::update(std::string)' : is abstract
observer.h(15) : see declaration of 'CoffeeHouse::Observers::Observer::update
Когда я нажимаю на ошибку "не могу создать экземпляр абстрактного класса"приводит меня к:
void Subject::Register(Observer observer)
Я понимаю, что абстрактные классы созданы таким образом, что их нельзя создать!
Как я могу сделать обновление тогда ??какие-либо предложения лучшего способа?
Я ценю любую помощь!