diff --git a/Decorator/decorator.cpp b/Decorator/decorator.cpp index 893993b..344c954 100644 --- a/Decorator/decorator.cpp +++ b/Decorator/decorator.cpp @@ -63,13 +63,13 @@ class Espresso : public Beverage { class CondimentDecorator : public Beverage { protected: - Beverage* beverage_ = nullptr; + unique_ptr beverage_; }; class Milk : public CondimentDecorator { public: - Milk(Beverage* beverage) { - beverage_ = beverage; + Milk(unique_ptr beverage) { + beverage_ = move(beverage); } string getDescription() override { @@ -83,8 +83,8 @@ class Milk : public CondimentDecorator { class Mocha : public CondimentDecorator { public: - Mocha(Beverage* beverage) { - beverage_ = beverage; + Mocha(unique_ptr beverage) { + beverage_ = move(beverage); } string getDescription() override { @@ -98,8 +98,8 @@ class Mocha : public CondimentDecorator { class Whip : public CondimentDecorator { public: - Whip(Beverage* beverage) { - beverage_ = beverage; + Whip(unique_ptr beverage) { + beverage_ = move(beverage); } string getDescription() override { @@ -113,8 +113,8 @@ class Whip : public CondimentDecorator { class Soy : public CondimentDecorator { public: - Soy(Beverage* beverage) { - beverage_ = beverage; + Soy(unique_ptr beverage) { + beverage_ = move(beverage); } string getDescription() override { @@ -126,6 +126,25 @@ class Soy : public CondimentDecorator { } }; +class Caramel : public CondimentDecorator { +public: + Caramel(unique_ptr beverage) { + beverage_ = move(beverage); + } + + string getDescription() override { + return beverage_->getDescription() + string(", Caramel"); + } + + float cost() override { + return beverage_->cost() + 0.15f; + } +}; + +#define M_MakeEspresso make_unique() +#define M_AddMocha(X) make_unique(X) +#define M_AddMilk(X) make_unique(X) + int main() { vector> orders; @@ -134,18 +153,13 @@ int main() { orders.push_back(make_unique()); orders.push_back(make_unique()); - unique_ptr house_blend = make_unique(); - orders.push_back(make_unique(house_blend.release())); - - house_blend = make_unique(); - orders.push_back(make_unique(house_blend.release())); - - house_blend = make_unique(); - orders.push_back(make_unique(house_blend.release())); + orders.push_back(make_unique(make_unique())); + orders.push_back(make_unique(make_unique())); + orders.push_back(make_unique(make_unique())); - house_blend = make_unique(); - unique_ptr house_blend_w_mocha = make_unique(house_blend.release()); - orders.push_back(make_unique(house_blend_w_mocha.release())); + orders.push_back(make_unique(make_unique(make_unique()))); + // or with macro + orders.push_back(M_AddMilk(M_AddMocha(M_MakeEspresso))); for (const auto& beverage : orders) { cout << beverage->getDescription() << '\t' << beverage->cost() << '\n';