#include <cmath>
#include <iostream>
#include <string>
using namespace std;
class Rectangle;
class Circle;
struct Shape {
using value_t = double;
Shape() = default;
virtual ~Shape() = default;
virtual value_t area() const = 0;
protected:
inline static const value_t pi = 3.1415926535897932;
inline static const value_t eps = 1e-12;
};
class Rectangle : virtual public Shape {
public:
Rectangle()
: width(0), height(0) {}
Rectangle(const value_t w, const value_t h)
: width(w), height(h) {}
value_t area()const override {
return width * height;
}
friend string compare_area(const Rectangle& r, const Circle& c);
friend string compare_area(const Circle& c, const Rectangle& r);
private:
value_t width;
value_t height;
};
class Circle : virtual public Shape {
public:
Circle()
: radius(0) {
}
explicit Circle(const value_t r)
: radius(r) {
}
value_t area()const override {
return pi * radius * radius;
}
friend string compare_area(const Rectangle& r, const Circle& c);
friend string compare_area(const Circle& c, const Rectangle& r);
private:
value_t radius;
};
string compare_area(const Rectangle& r, const Circle& c) {
const auto ds = r.area() - c.area();
if (fabs(ds) < Shape::eps) return "Rectangle is equal to Circle";
return ds < 0 ? "Rectangle < Circle" : "Circle < Rectangle";
}
string compare_area(const Circle& c, const Rectangle& r) {
const auto ds = r.area() - c.area();
if (fabs(ds) < Shape::eps) return "Circle is equal to Rectangle";
return ds < 0 ? "Rectangle < Circle" : "Circle < Rectangle";
}
int main() {
Rectangle r1(2, 3);
Circle c(1.5);
cout << compare_area(r1, c) << '\n';
cout << compare_area(c, r1) << '\n';
Rectangle r2(3, 4);
cout << compare_area(r2, c) << '\n';
cout << compare_area(c, r2) << '\n';
Rectangle r3(2, 3.534291735288517);
cout << compare_area(r3, c) << '\n';
cout << compare_area(c, r3) << '\n';
}
Требования:
Класс Rectangle должен иметь поля width и height.
Класс Circle должен иметь поле radius.
Реализуйте методы для вычисления площади для каждого класса.
Используйте дружественную функцию для сравнения площадей.