Używamy hierarchii klas reprezentującej figury (klasa bazowa Figure, klasy pochodne Rectangle, Triangle). dodaj dwie funkcje 'numRectangles' i 'names', dla każdej z nich argumentem jest kolekcja (wektor) figur. 'numRectangles' oblicza liczbę kół w tej kolekcji, zaś 'names' dostarcza napis, który zawiera nazwy figur rozdzielone spacją. Dla przedstawionego przykładu, po uruchomieniu funkcji 'main', funkcja 'names' napis "Rectangle Triangle Rectangle ", funkcja 'numRectangles' zwróci 2, zaś funkcja 'sumArea' zwróci wartość 7.
#include#include #include #include using namespace std; class Visitor; class Figure { public: Figure() {} virtual void accept(Visitor& v) = 0; virtual double getArea() const = 0; }; class Rectangle; class Triangle; class Visitor { public: virtual ~Visitor() {} virtual void visit(Rectangle&) = 0; virtual void visit(Triangle&) = 0; }; class Rectangle : public Figure { public: Rectangle(double site_a, double site_b) : Figure(), a(site_a), b(site_b) {} virtual void accept(Visitor& v) { v.visit(*this); } virtual double getArea() const { return a * b; } private: double a; double b; }; class Triangle : public Figure { public: Triangle(double base, double height) : Figure(), b(base), h(height) {} virtual void accept(Visitor& v) { v.visit(*this); } virtual double getArea() const { return 0.5 * b * h; } private: double b; double h; }; using PFigure = shared_ptr
Polecenia: