オブザーバパターンに少し問題があります デコレータファインを使用する飲料クラスがあります。 私はオブザーバ(この場合、携帯電話/テキストメッセージなど)に注文が行われたときを知らせるためにオブザーバを実装しようとしています。彼らはうまく動作するので、私は飲み物/デコレータクラスを含むことはありません。ここで C++のオブザーバパターン
が対象クラスです..私は対象クラス、オブザーバー、携帯電話の行動クラスとcellhone1、cellphone2クラスを持っている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");
:メインで
は、私はこのような何かをするつもりでしたここで
#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
と綴りました。これらの問題を修正しましたが、同じエラーが発生しました。 –