2015-12-03 2 views
0

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

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

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

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

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

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

+1

Прочтите это - здесь есть много хороших примеров. http://gillius.org/ooptut/ – Dmitriy

ответ

2

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

Благодарим вас за ответ и время LogicStuff. Я ценю вашу помощь. Не могли бы вы привести мне пример, как добавить прямоугольник в список с параметрами? И если я хочу, как я могу расширить свой список с помощью многоугольника? Благодарю. – yusuf

+1

@yusuf Вы знакомы с полиморфизмом? Это будет лучше для вас, если вы посмотрите на него, вместо того, чтобы я опубликовал почти полный код. – LogicStuff

+0

Да, я знаю полиморфизм, но никогда не использовал его в C++. Я изучил полиморфизм с Java. Но если я увижу этот пример, мне было бы очень удобно идти вперед. – yusuf

Смежные вопросы