2011-01-22 4 views
0

У меня возникли проблемы с шаблоном наблюдателя У меня есть класс напитков, который отлично использует декоратор. Я пытаюсь реализовать наблюдателя, чтобы позволить наблюдателю (скажем, сотовый телефон/текстовое сообщение) в этом случае знать, когда будет выполнен заказ. Я не буду включать классы напитка/декоратора, так как они отлично работают.Шаблон наблюдателя в 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) 

Я понимаю, что абстрактные классы сделаны так, что они не могут быть созданы!

Как я могу сделать обновление тогда? любые предложения лучшего способа?

Я ценю любую помощь!

+3

Вы можете попробовать правильно отпечатать свой код. Намного легче читать код, который имеет какую-то последовательную схему отступов. –

+0

Ваш метод Обновление в CellPhone опечатка? Ваш наблюдатель записал это как обновление (std :: string) – greatwolf

+0

Я исправил все эти опечатки .. спасибо, все еще имея те же ошибки, хотя –

ответ

1

Одна ошибка заключается в том, что Subject :: Register принимает объект Observer вместо указателя на Observer. Это означает, что вы пытаетесь создать экземпляр абстрактного объекта, который является незаконным.

+0

Как я могу это исправить? –

+0

Думаю, я понял. sorr, работал весь день на этом. void Subject :: Register (Observer * o)? мой список правильный? или есть лучший способ? –

+0

Нет, это прекрасное решение. –

1

Проблемы я вижу:

  • Вы можете использовать пространство имен и класс под названием Observer в PhoneBehavior и CellPhone1 исходных файлов класса.
  • В исходном файле класс CellPhone1 вы сделать не #include <string> или использовать пространство имен зЬх для строки в void Update(string message)
  • В исходном файле класса PhoneBehavior virtual void update() должен , вероятно, есть капитал «U», чтобы остаться в соответствии с ваш стиль кодирования и , потому что это то, как он вызывается в исходном файле класса Cell10 CellPhone1.
  • В исходном файле класса CellPhone1 у вас есть Cout <<"CellPhone1:" + message);. Он должен быть std::cout << "CellPhone1: " << message;
  • В CellPhone1 исходного класса файл вам нужно #include <iostream>
  • Вы слишком много скобок закрытия в исходном файле класса PhoneBehavior. И только закрывающая скобка, соответствующая открывающей скобе вашего class PhoneBehavior, должна иметь точку с запятой после нее.

Редактировать: Когда я говорю «исходный файл класса», я предполагаю, что вы создаете проект с файлами CellPhone1.cpp, PhoneBehavior.cpp на основе того, как вы представили свой вопрос.

+0

исправил все эти проблемы, у меня все еще возникают те же проблемы .. »« CoffeeHouse :: Наблюдатели :: Наблюдатель ': не может создать экземпляр абстрактного класса " –

+0

Обновлен мой ответ еще двумя проблемами. –

+0

Спасибо, я исправил его. –

Смежные вопросы