// Adaption from Head First design Patterns #pragma once #include "Duck.hpp" #include "FlyBehavior.hpp" #include "QuackBehavior.hpp" #include class Duck { private: FlyBehavior* _flyBehavior; QuackBehavior* _quackBehavior; Duck( const Duck& ); // Disable copy constructor void operator=( const Duck& ); // Disable assignment operator protected: Duck( FlyBehavior* flyBehavior, QuackBehavior* quackBehavior ) : _flyBehavior( flyBehavior ), _quackBehavior( quackBehavior ) { assert( flyBehavior ); assert( quackBehavior ); } public: virtual ~Duck() {} void setFlyBehavior( FlyBehavior* fb ) { assert( fb ); _flyBehavior = fb; } void setQuackBehavior( QuackBehavior* qb ) { assert( qb ); _quackBehavior = qb; } void performFly() const { _flyBehavior->fly(); } void performQuack() const { _quackBehavior->quack(); } void swim() const { std::cout << "All ducks float, even decoys!" << std::endl; } virtual void display() const = 0; };