У меня возникли проблемы с шаблоном наблюдателя У меня есть класс напитков, который отлично использует декоратор. Я пытаюсь реализовать наблюдателя, чтобы позволить наблюдателю (скажем, сотовый телефон/текстовое сообщение) в этом случае знать, когда будет выполнен заказ. Я не буду включать классы напитка/декоратора, так как они отлично работают.Шаблон наблюдателя в C++
В основном я собирался сделать что-то вроде этого:
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");
У меня есть класс, предмет наблюдатель, класс поведения телефона и cellhone1, 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)
Я понимаю, что абстрактные классы сделаны так, что они не могут быть созданы!
Как я могу сделать обновление тогда? любые предложения лучшего способа?
Я ценю любую помощь!
Вы можете попробовать правильно отпечатать свой код. Намного легче читать код, который имеет какую-то последовательную схему отступов. –
Ваш метод Обновление в CellPhone опечатка? Ваш наблюдатель записал это как обновление (std :: string) – greatwolf
Я исправил все эти опечатки .. спасибо, все еще имея те же ошибки, хотя –