2011-01-24 6 views
0

私は飲み物タイプのプログラムを注文しています。私はオブザーバーパターンを実装するtryigですので、携帯電話/オブザーバーが注文を表示すると、基本的に彼らにアップデートを知らせるようになります。オブザーバーの更新に関するヘルプが必要です。

私はちょうどこれを行う方法がわかりません。私がTheOrderクラスをupdate()orderクラスに渡すと、エラーが発生します。ここ

は私のオブザーバークラスです..更新()オブザーバーと携帯電話でとTheOrderクラスにあるを投稿するにはあまりにも多く:ここ

#ifndef _OBSERVER_ 
#define _OBSERVER_ 

#include <string> 
//#include "TheOrder.h" 

namespace CoffeeHouse { 
namespace Observers { 

//class Subject; 
class Observer { 

protected: virtual ~Observer() = 0 { 
}; 
public: 
// virtual 
    virtual void update()= 0; 
}; 

} // namespace Observer 
} // namespace HeadFirstDesignPatterns 

#endif 

オブザーバー具象クラスです

#ifndef _CELLPHONE1_ 
#define _CELLPHONE1_ 
#include <iostream> 
using namespace std; 

namespace CoffeeHouse { 
namespace Observers { 

class CellPhone1: public Observer { 
public: 
    std::string _number; 


    CellPhone1(std::string number){ 
     _number = number; 
    } 

    void update() 
{ 
    std::cout << "BUZZZZZZZ - CellPhone #" << _number << " your order is ready " << endl; 
} 
}; 

} // namespace Observer 
} // 

#endif 

は、ここでは対象クラス

#ifndef _SUBJECT_ 
#define _SUBJECT_ 

#include "Starbuzz.h" 
//#include "Starbuzz2.h" 
#include "Observer.h" 
#include <list> 
#include "Beverage.h" 

namespace CoffeeHouse { 
namespace Observers { 

class Subject { 

protected: virtual ~Subject() = 0 { 
}; 
public: virtual void registerObserver(Observer* o) = 0; 
public: virtual void removeObserver(Observer* o) = 0; 
public: virtual void notifyObservers() = 0; 
}; 

} // namespace Observer 
} 

#endif 

は、ここでは被験者具象クラスです

ここ
#ifndef _THE_ORDER_ 
#define _THE_ORDER_ 


#include "Beverage.h" 
#include <list> 
#include <iostream> 
#include "Order.h" 

#pragma once; 
//class Order; 
using namespace CoffeeHouse::Decorator; 
namespace CoffeeHouse { 
namespace Observers { 


class TheOrder : public Subject { 



private: mutable std::list< Observer* > _observers; 
private: mutable std::list< Order* > _orders; 

//public: virtual ~Order() = 0 
//public: ~TheOrder(); 
public: void NewOrder(Beverage* bev, Observer* cellphone) 
     { 
     // _orders.push_front(new Order(bev, cellphone)); 
     //_//observers.push_front(new Order(bev)); 

     } 

public: void registerObserver(Observer* o) { assert(o); 
    _observers.push_back(o); 
} 

public: void removeObserver(Observer* o) { assert(o); 
    _observers.remove(o); 
} 

public: void notifyObservers() { 
    for(std::list< Observer* >::iterator iterator = _observers.begin(); _observers.end() != iterator; ++iterator) { 
     Observer* observer = *iterator; 
     observer->update(); 

    } 
} 


}; 
//} 
} // namespace Observer 
} // namespace CoffeeHouse 

#endif 

オブザーバー具象クラスが

#include "Starbuzz.h" //just header files 
#include "Starbuzz2.h" // just header files 
#include "Subject.h" 

#include "TheOrder.h" 
#include "CellPhone2.h" 
#include "CellPhone1.h" 

using namespace CoffeeHouse::Decorator; 
using namespace CoffeeHouse::Observers; 


int main(int argc, char* argv[]) 
{ 

Beverage* beverage2 = new DarkRoast(); 
beverage2 = new Mocha(beverage2); 
beverage2 = new Mocha(beverage2); 
beverage2 = new Whip(beverage2); 

std::cout << "Current Orders: " << endl; 
std::cout << beverage2->getDescription() 
    << " $" 
    << beverage2->cost() 
    << std::endl; 

Beverage* beverage3 = new HouseBlend(); 
beverage3 = new Soy(beverage3); 
beverage3 = new Mocha(beverage3); 
beverage3 = new Whip(beverage3); 
std::cout << beverage3->getDescription() 
    << " $" 
    << beverage3->cost() 
    << std::endl; 

delete beverage3; 
delete beverage2; 
//delete beverage; 

Bagel* bagel = new Plain(); 
std::cout.setf(std::ios::showpoint); 
std::cout.precision(3); 
std::cout << bagel->getDescription() 
    << " $" 
    << bagel->cost() 
    << std::endl; 

Bagel* bagel2 = new Raisen(); 
bagel2 = new Myhummus(bagel2); 
bagel2 = new SesemeSeed(bagel2); 
bagel2 = new CreameCheese(bagel2); 
std::cout << bagel2->getDescription() 
    << " $" 
    << bagel2->cost() 
    << std::endl; 



Bagel* bagel3 = new Onion(); 
bagel3 = new Myhummus(bagel3); 
bagel3 = new SesemeSeed(bagel3); 
bagel3 = new CreameCheese(bagel3); 
std::cout << bagel3->getDescription() 
    << " $" 
    << bagel3->cost() 
    << std::endl; 


TheOrder* orders = new TheOrder(); 
CellPhone1* cellphone1 = new CellPhone1("1"); 
orders->registerObserver(cellphone1); 
orders->notifyObservers(); 

TheOrder* order = new TheOrder(); 
CellPhone1* obj2 = new CellPhone1("3"); 
order->registerObserver(obj2); 
    order->notifyObservers(); 


return 0; 
} 

)(メイン

#ifndef _CELLPHONE1_ 
#define _CELLPHONE1_ 
#include <iostream> 
using namespace std; 

namespace CoffeeHouse { 
namespace Observers { 

class CellPhone1: public Observer { 
public: 
    std::string _number; 


    CellPhone1(std::string number){ 
     _number = number; 
    } 

    void update() 
{ 
    std::cout << "BUZZZZZZZ - CellPhone #" << _number << " your order is ready " << endl; 
} 
}; 

} // namespace Observer 
} // 

#endif 

である私はちょうど私が、それぞれ異なる順序を表示することができるようにcellphone1クラスにオーダーを送りたい..私私は更新機能を介してそれを送信する必要があると思う..

cellphone1はオブザーバーなので、そこに..

TheOrderクラスには、このポインタを渡す必要があるnotifyObservers()関数がありますか?また

+2

これはあなただけで投稿同じ質問はありませんか?私たちはあなたのコードの**すべて**を読んでほしくなかったが、まだしていない。投稿するコードの量を減らす必要があるため、質問がはっきりと簡潔になります。実際の質問とは関係のないコードをすべて削除します。 – JaredC

+0

icelated - 私にはADHDがあります。驚くほど興味深い問題で私を掃除することができない限り、また別のオブザーバの実装はそうではありません。あなたが私を助けてくれるようにしたいのであれば、質問を短く、明確にする必要があります。それが立っているので、単に私にとっては不可能です。 –

+0

私が投稿したすべてのコードはあなたが見る必要があるコードです。別のクラスに複数のアップデートがある場合、どうすればいいですか? –

答えて

0

Observerパターンを実装する一般的な方法は2つあります。最初のObserverは、Observableへの参照を保持しています。あなたのケースでは、各CellphoneオブジェクトにどのOrderオブジェクトが待っているかを伝える必要があります。携帯電話1台につき1つの注文しか持たなかった場合、これはあまり難しいことではありません。携帯電話ごとに注文以上の注文がある場合は、携帯電話のクラスで何とかそれを管理する必要があります。

一般的な2番目の方法は、Observableをupdate()メソッドのObserverに渡すことです。そして、あなたは携帯電話のupdate方法で特定の注文完了へのアクセスを持っているでしょう

void update(TheOrder *order); 

:あなたのケースでは、あなたはObserverupdateの署名を変更するだろうとのそのサブクラスのすべて。修正する

+0

があると思います:エラーC2061:構文エラー:識別子 'TheOrderおよびエラーC2259:' CoffeeHouse :: Observers :: CellPhone1 ':抽象をインスタンス化できませんクラス。今、もし私が "TheOrder.h"をインクルードすれば、それは私にもっと多くのエラーを与えます - サブジェクトクラスが今では定義されていないのと同じように –

+0

あなたは 'TheOrder'へのポインタを使用しているので、' class TheOrder; TheOrder.hを含む。 'CellPhone1'の' update'メソッドのシグネチャを新しいメソッドシグネチャに変更したことを確認してください。また、 'TheOrder'は' Subject'のサブクラスであるため、TheOrder.hにSubject.hを含める必要があります。前に働いていた唯一の理由は、 'main.cpp'のインクルードの順序のせいです。あなたは、あなたのプログラムが正しく動作するためにインクルード注文に頼るべきではありません。 –

+0

それは働いた..しかし、私は注文がそこにないので、私は注文を渡すことを望んでいません - 私はメインから注文を作成しています。 –

0

一つのこと:

protected: virtual ~Observer() = 0 { }; 
関連する問題