| /* File : example.c */ |
| |
| #include "example.h" |
| #include <stdio.h> |
| |
| #ifndef M_PI |
| #define M_PI 3.14159265358979323846 |
| #endif |
| |
| /* Move the shape to a new location */ |
| void Shape::move(double dx, double dy) { |
| x += dx; |
| y += dy; |
| } |
| |
| int Shape::nshapes = 0; |
| |
| double Circle::area(void) { |
| return M_PI*radius*radius; |
| } |
| |
| double Circle::perimeter(void) { |
| return 2*M_PI*radius; |
| } |
| |
| double Square::area(void) { |
| return width*width; |
| } |
| |
| double Square::perimeter(void) { |
| return 4*width; |
| } |
| |
| Circle* createCircle(double w) |
| { |
| return new Circle(w); |
| } |
| |
| Square* createSquare(double w) |
| { |
| return new Square(w); |
| } |
| |
| ShapeOwner::ShapeOwner() { |
| printf(" ShapeOwner(%p)\n", (void *)this); |
| } |
| |
| ShapeOwner::~ShapeOwner() |
| { |
| printf(" ~ShapeOwner(%p)\n", (void *)this); |
| for(unsigned i=0;i<shapes.size();i++) |
| delete shapes[i]; |
| } |
| |
| void ShapeOwner::add(Shape* ptr) // this method takes ownership of the object |
| { |
| shapes.push_back(ptr); |
| } |
| |
| Shape* ShapeOwner::get(int idx) // this pointer is still owned by the class (assessor) |
| { |
| if (idx < 0 || idx >= static_cast<int>(shapes.size())) |
| return NULL; |
| return shapes[idx]; |
| } |
| |
| Shape* ShapeOwner::remove(int idx) // this method returns memory which must be deleted |
| { |
| if (idx < 0 || idx >= static_cast<int>(shapes.size())) |
| return NULL; |
| Shape* ptr=shapes[idx]; |
| shapes.erase(shapes.begin()+idx); |
| return ptr; |
| } |