#pragma once #include "iterators.h" class IShape { IShape* next = nullptr; IShape* prev = nullptr; public: virtual ~IShape() = default; virtual void draw() const = 0; virtual double area() const = 0; void set_next(IShape* n) { next = n; if (n) n->prev = this; } IShape* get_next() const { return next; } IShape* get_prev() const { return prev; } template Traversal traverse() { return Traversal(this); } using forward = IteratorForward; using backward = IteratorBackward; }; class Circle : public IShape { double r; public: Circle(double radius) : r(radius) {} void draw() const override { std::cout << "Drawing Circle of radius " << r << "\n"; } double area() const override { return 3.14159 * r * r; } };