инкапсуляция — иерархия классов геометрических примитивов

Я новичок в C ++, и я хотел бы работать над моим первым учебником.

Я хочу написать программу, которая будет осуществлять поиск по списку объектов, представляющих графические символы.

Список содержит прямоугольники, описанные двумя длинами ребер, и круги, описанные радиусом.

Я также хочу создать процедуру поиска, которая принимает список и длину ребра прямоугольника и возвращает другой список, содержащий только эти символы, которые помещаются в данный прямоугольник.

Реализация списка (и функция поиска) должна позволять
расширить список принятых символов (например, добавить многоугольник) без изменения
любой из существующего кода.

Какой подход я должен следовать? Не могли бы вы привести пример, аналогичный моей цели?

0

Решение

Это использование для полиморфизма — вы будете иметь 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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]