2011-01-22 7 views
0

オブザーバパターンに少し問題があります デコレータファインを使用する飲料クラスがあります。 私はオブザーバ(この場合、携帯電話/テキストメッセージなど)に注文が行われたときを知らせるためにオブザーバを実装しようとしています。彼らはうまく動作するので、私は飲み物/デコレータクラスを含むことはありません。ここで 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) 

抽象クラスは、インスタンス化できないように作られていることを理解しています。

どうすれば更新できますか?より良い方法の提案?

ご協力いただきありがとうございます。私が見

+3

コードのインデントを正しく行うことができます。ある種の一貫した字下げスキームを持つコードを読む方がはるかに簡単です。 –

+0

はあなたのメソッドですCellPhoneでタイプミスの更新?あなたのオブザーバーは更新(std :: string) – greatwolf

+0

と綴りました。これらの問題を修正しましたが、同じエラーが発生しました。 –

答えて

1

Observerへのポインタではなく、Subject :: Registerが現在Observerオブジェクトを取っているというエラーが1つあります。これは、抽象オブジェクトをインスタンス化しようとしていることを意味しますが、これは違法です。

+0

これを修正するにはどうすればいいですか? –

+0

私はそれを得たと思う。ソーラー、これで終日働いています.. void Subject :: Register(Observer * o)?私のリストは正しいですか?それとも良い方法がありますか? –

+0

いいえ、それは素晴らしい修正です。 –

1

問題:

  • あなたは、名前空間とクラス を使用するには、PhoneBehavior とCellPhone1クラスのソースファイルにObserverと呼ばれます。あなたはPhoneBehaviorクラスのソースファイルで virtual void update()をしませ#include <string>を行うかvoid Update(string message)
  • 内の文字列のための std名前空間を使用し CellPhone1クラスのソースファイルで
  • は はおそらくと は一貫滞在する資本「U」を持っている必要がありますあなたのコーディングスタイルは です。なぜなら、これは CellPhone1クラスのソースファイルで呼び出されたからです。
  • CellPhone1クラスのソースファイルには、Cout <<"CellPhone1:" + message);があります。それはあなたがあなたがPhoneBehaviorクラスのソースファイル内であまりにも多くの閉じ括弧を持って#include <iostream>
  • に必要CellPhone1クラスのソースファイルでstd::cout << "CellPhone1: " << message;
  • でなければなりません。そして、あなたのclass PhoneBehaviorの開き括弧に対応する閉じ括弧のみがセミコロンで終わるはずです。

編集:私は "class source file"と言うとき、私はあなたの質問を提示した方法に基づいてCellPhone1.cpp、PhoneBehavior.cppファイルを使ってプロジェクトをセットアップすると仮定しています。

+0

まだ問題は解決しています。 "'CoffeeHouse :: Observers :: Observer ':抽象クラスをインスタンス化できません " –

+0

私が見つけたさらに2つの問題で私の応答を更新しました。 –

+0

ありがとう私はそれを修正しました.. –

関連する問題