-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathshapes.cpp
More file actions
100 lines (83 loc) · 2.49 KB
/
shapes.cpp
File metadata and controls
100 lines (83 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Shape
{
public:
virtual ~Shape() {}
virtual double getArea() const = 0;
virtual double getPerimeter() const = 0;
virtual void print() const { cout << "Unknown Shape" << endl; }
};
class Rectangle : public Shape
{
public:
Rectangle(double x, double y) : x_(x), y_(y) {}
Rectangle(const Rectangle & other) { x_ = other.getX(); y_ = other.getY(); }
double getArea() const { return x_ * y_; }
double getPerimeter() const { return 2 * (x_ + y_); }
double getX() const { return x_; }
double getY() const { return y_; }
void print() const {
cout << "Rectangle: x: " << getX() << endl
<< " y: " << getY() << endl
<< " area: " << getArea() << endl
<< " perimeter: " << getPerimeter() << endl;
}
private:
Rectangle();
double x_;
double y_;
};
class Square : public Rectangle
{
public:
Square(double x) : Rectangle(x, x) {}
Square(const Square & other) : Rectangle(other.getX(), other.getX()) {}
double getArea() { return getX() * getX(); }
double getPerimeter() { return 4 * getX(); }
void print() {
cout << "Square: x: " << getX() << endl
<< " area: " << getArea() << endl
<< " perimeter: " << getPerimeter() << endl;
}
private:
double getY(); // should not have Y dimension
Square();
};
bool sortByArea(Shape* first, Shape* second)
{
if(first == NULL || second == NULL)
{
return false;
}
return (first->getArea() < second->getArea());
}
typedef vector<Shape*> Collection;
void printCollectionElements(const Collection& collection)
{
for(Collection::const_iterator it = collection.begin(); it != collection.end(); ++it)
if(*it != NULL)
(*it)->print();
}
void printAreas(const Collection& collection)
{
for(Collection::const_iterator it = collection.begin(); it != collection.end(); ++it)
if(*it != NULL)
cout << (*it)->getArea() << endl;
}
int main() {
Collection shapes;
shapes.push_back(new Rectangle(4.0, 2.0));
shapes.push_back(new Rectangle(10.0, 5.0));
shapes.push_back(new Square(3.0));
shapes.push_back(new Square(4.0));
printCollectionElements(shapes);
cout << "Areas before sort: " << endl;
printAreas(shapes);
sort(shapes.begin(), shapes.end(), sortByArea);
cout << "Areas after sort: " << endl;
printAreas(shapes);
return 0;
}