2011-01-23 3 views
0

改訂cを一緒に使用...オブザーバーとデコレータは、私はプログラムがデコレータ/ラッパーとして飲料を行いコーヒーハウスのthats持っ++ * *

私もオブザーバーを持っていると私は飲料とのことをで結ぶしようとしています。そう、注文が携帯電話1に置かれると、通知されます。私は更新を行う方法を知らない。

私はTheOrderクラスを渡すとエラーが出る!

飲料コンクリートクラスの

#ifndef _BEVERAGE_ 
#define _BEVERAGE_ 

#include "Starbuzz.h" 


namespace CoffeeHouse { 
namespace Decorator { 
    //namespace Observer { 
    //using namespace std; 

    class Beverage { 

    protected: std::string _description; 

    protected: Beverage() : 
     _description("Unknown Beverage") { 
     } 
    public: virtual ~Beverage() = 0 { 
      } 
    public: virtual std::string getDescription() const { 
       return _description; 
      } 
    public: virtual double cost() const = 0; 
    }; 

} // namespace Observer 
} // namespace CoffeeHouse 
//} 
#endif 

1 beverage.h - 私は4(エスプレッソ、houseblend、darkroast、カフェイン抜き)

#ifndef _DARK_ROAST_ 
#define _DARK_ROAST_ 

#include "Starbuzz.h" 

namespace CoffeeHouse { 
namespace Decorator { 
//namespace Observer { 
class DarkRoast : public Beverage { 

public: 

    DarkRoast() 
     { 
    _description = "Dark Roast Coffee"; 
} 
public: double cost() const { 
    return 0.99; 
} 
}; 

} // namespace Observer 
} 

#endif 

飲料デコレータ

#ifndef _BEVERAGE_DECORATOR_ 
#define _BEVERAGE_DECORATOR_ 

#include "Starbuzz.h" 


namespace CoffeeHouse { 
namespace Decorator { 

class BeverageDecorator : public Beverage { 

private: BeverageDecorator(const BeverageDecorator&); // Disable copy constructor 
private: void operator=(const BeverageDecorator&); // Disable assignment operator 

protected: BeverageDecorator() { 
} 
public: virtual ~BeverageDecorator() = 0 { 
}; 
public: virtual std::string getDescription() const = 0; 
}; 
//} 
} // namespace Observer 
} // namespace CoffeeHouse 

#endif 

ここ有しますオブザーバの実装です。

テーマクラスここで

#ifndef _SUBJECT_ 
#define _SUBJECT_ 
#include "Observer.h" 
#include <list> 

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; 

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) 
     { 
      _orders.push_front(new Order(bev)); 
     //_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 

は、観察者にあるcellphone1あり、ここで

#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 

メイン()

#include "Starbuzz.h" 
#include "Starbuzz2.h" 
#include "Subject.h" 

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

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


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


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; 



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

    Beverage* beverage6 = new DarkRoast(); 
orders->NewOrder(new Mocha(new Soy(new Whip((beverage6))))); 


return 0; 

}ここ

は順番クラスは、今私がちょうど更新を行う必要があり、そう

#ifndef _ORDER_ 
#define _ORDER_ 
#include <iostream> 
#include "Beverage.h" 

namespace CoffeeHouse { 
namespace Decorator { 

class Order { 


    Beverage* _beverage; 
public: 
    Order(Beverage* beverage) 
    { 
     _beverage = beverage; 
    } 




}; 
} 
} 
#endif 

です。 update()で渡す必要があるのは何ですか?

携帯電話で注文を表示できるように、更新の順番で渡したいと思います。もし私が "theorder.h"をインクルードしなければならない注文クラスを渡そうとすると、何百万ものエラーが発生します。あなたが明示的に各メソッド/属性の「アクセス指定」(パブリック/プライベート/保護された)を宣言する必要はありません

1):ここでは

+3

ここには多すぎる独立した質問があります。あなたの投稿をかなり編集して、特定の問題に集中できますか? –

+0

私はそれを更新し、いくつかの事を変えた。 –

+1

それはまだtl;虎 – KitsuneYMG

答えて

0

は、ソースコードを読みやすくするのに役立ついくつかのコメントです。デフォルトでは、クラスには "private"指定子があり、別の宣言に遭遇するまで繰り返し適用されます。

2.)コードスニペットが特定のソースファイルに属している場合、私たちに推測させる代わりに、ファイル名を教えてください。

3.間接的なインクルードを避けるようにします(依存ヘッダーは別のファイルに含まれています)。現在のプロジェクトでは、すべてのクラスが「Starbuzz.h」に依存しており、手動で挿入順序を解釈することは困難です。 フォワード宣言についてさらに知りたいことがあります。

関連する問題