/* File : example.h */
#include <vector>

class Shape {
public:
  Shape() {
    nshapes++;
  }
  virtual ~Shape() {
    nshapes--;
  };
  double  x, y;   
  void    move(double dx, double dy);
  virtual double area(void) = 0;
  virtual double perimeter(void) = 0;
  static  int nshapes;
};

class Circle : public Shape {
private:
  double radius;
public:
  Circle(double r) : radius(r) { };
  virtual double area(void);
  virtual double perimeter(void);
};

class Square : public Shape {
private:
  double width;
public:
  Square(double w) : width(w) { };
  virtual double area(void);
  virtual double perimeter(void);
};


Circle* createCircle(double w); // this method creates a new object
Square* createSquare(double w); // this method creates a new object

class ShapeOwner {
private:
    std::vector<Shape*> shapes;
    ShapeOwner(const ShapeOwner&); // no copying
    ShapeOwner& operator=(const ShapeOwner&); // no copying
public:
    ShapeOwner();
    ~ShapeOwner();
    void add(Shape* ptr); // this method takes ownership of the object
    Shape* get(int idx); // this pointer is still owned by the class (assessor)
    Shape* remove(int idx); // this method returns memory which must be deleted
};

  
