Я новичок в C ++, и я хотел бы работать над моим первым учебником.
Я хочу написать программу, которая будет осуществлять поиск по списку объектов, представляющих графические символы.
Список содержит прямоугольники, описанные двумя длинами ребер, и круги, описанные радиусом.
Я также хочу создать процедуру поиска, которая принимает список и длину ребра прямоугольника и возвращает другой список, содержащий только эти символы, которые помещаются в данный прямоугольник.
Реализация списка (и функция поиска) должна позволять
расширить список принятых символов (например, добавить многоугольник) без изменения
любой из существующего кода.
Какой подход я должен следовать? Не могли бы вы привести пример, аналогичный моей цели?
Это использование для полиморфизма — вы будете иметь std::vector<Object*>
или же std::vector<std::shared_ptr<Object>>
держать список объектов.
Объект должен выглядеть примерно так:
class Object
{
public:
virtual ~Object() = default;
// needs to be implemented by deriving classes i.e. Rectangle and Circle
virtual bool fitsIn(Rectangle const& r) const = 0;
};
И конечно Rectangle
а также Circle
будет наследовать от него:
class Rectangle : public Object
{
int x, y, w, h;
public:
Rectangle(int x, int y, int w, int h) : x(x), y(y), w(w), h(h) {}
virtual bool fitsIn(Rectangle const& r) const override
{
// return whether can fit in r based on this object's and r's x, y, w and h
}
};
Затем вы сможете добавить его в список, выполнить итерацию и вызвать fitsIn
на каждом элементе, толкая его к другому вектору в зависимости от того, что fitsIn
возвращает:
std::vector<std::shared_ptr<Object>> objects, fitting_objects;
objects.push_back(new Rectangle(10, 10, 20, 20)); // classic polymorphism spectacle
// rectangle for the area containing the objects we're looking for
Rectangle r(5, 5, 30, 30);
for(auto const& object : objects)
if(object.fitsIn(r))
fitting_objects.push_back(object);
Других решений пока нет …