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
; using Figures = vector; //suma pól figur w kolekcji double sumArea(const vector& figures) { double sum = 0.0; for(PFigure f : figures) sum += f->getArea(); return sum; } //nazwy figur rozdzielone spacją, nazwa dla Rectangle to "Rectangle", nazwa dla Triangle to "Traingle" string names(const Figures& figures) { } //liczba prostokatow w kolekcji int numRectangles(const Figures& figures) { } int main() { Figures figures; figures.push_back(PFigure(new Rectangle(1.0, 1.0) )); figures.push_back(PFigure(new Triangle(2.0, 2.0) )); figures.push_back(PFigure(new Rectangle(2.0, 2.0) )); cout << "numFigures:" << figures.size() << endl; cout << "numRectangles:" << numRectangles(figures) << endl; cout << "names:" << names(figures) << endl; cout << "sumArea:" << sumArea(figures) << endl; return 0; }

Polecenia:

  1. Podaj kod funkcji names
  2. Podaj kod funkcji numRectangles
  3. Podaj nazwę użytego obiektowego wzorca projektowego