Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание библиотеки графических объектов 
:(
    Опции темы
Zanoza
  Дата 6.5.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.5.2007
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Здравствуйте!   smile Мне нужно реализовать библиотеку графических объектов, содержащую классы Shape (абстрактный), Point, Line (отрезок), Rectangle, Square, Circle, Polyline, Polygon (замкнутая Polyline), Triangle, Figure (контейнер других фигур). [font=impact]При включении в Figure все потомки Shape имеют координаты относительно Figure. Сама Figure также является наследником Shape и таким образом может содержать другие Figure. Каждый объект может себя рисовать, выполнять параллельный перенос, а также поворот относительно не-которой точки, передаваемой в качестве параметра (по умолчанию вращение должно происходить отно-сительно опорной точки объекта). Опорная точка должна храниться в базовом классе Shape. Ее выбор для объекта не всегда тривиален. К примеру, для прямоугольника в качестве опорной точки можно вы-брать одну из вершин либо же центр симметрии.

Я никак не могу понять каким образом Figure может быть наследником Shape (это же контейнер)? Может кто-нибудь может объяснить в чем смысл моей задачи?   smile 
PM MAIL   Вверх
nickless
Дата 6.5.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Zanoza @  6.5.2007,  11:54 Найти цитируемый пост)
Я никак не могу понять каким образом Figure может быть наследником Shape (это же контейнер)

А почему бы нет? Смысл в том, что с помощью Figure можно будет теми же методами (виртуальными, полезно для полиморфизма) рисовать составные фигуры.
Т.е. например Figure имеет методы
Код

virtual int add_shape(Shape* shape, int x, int y); // добавить часть фигуры, возвращает уникальный индех этой фугуры
virtual void remove_shape(int index); // удалить фигуру
...

Тогда можно будет присто вызвать что-то вроде figure.draw(), которая в свою очередь вызовет draw() всех своих частей, в деструкторе ~Figure желательно удалять все части.

Тогда можно будет сделатъ нечто вроде
Код

vector <Shape*> v;
v.push_back(new Line(...));
v.push_back(new Circle(...));
v.push_back(new Square(...));
Figure* f;
f.add_shape(Line(...), 3, 8)
f.add_shape(Rectangle(...), 5, 0)
f.add_shape(Polygon(...), 4, 5)

for (int i=0; i<v.size(); i++)
    v[i]->draw();

for (int i=0; i<v.size(); i++)
    delete v[i];



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
adLucem
Дата 6.5.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: нет
Всего: 5



Описание шаблона компоновщик в Wikipedia

Код

#include <iostream>
#include <vector>
using namespace std;

class Shape {
public:
    virtual vector<Shape*> *Dependences ( ) = 0;
};

class Figure : public Shape {
public:
    Figure ( ) {
        m_Dependences = new vector<Shape*> ( );
    }
    vector<Shape*> *Dependences ( ) {
        return m_Dependences;
    }
private:
    vector<Shape*> *m_Dependences;
};

class Rectangle : public Shape {
public:
    vector<Shape*> *Dependences ( ) {
        return 0;
    }
};

void main ( ) {
    vector<Shape*> shapes;
    shapes.push_back ( new Figure ( ) );
    shapes.push_back ( new Rectangle ( ) );

    for ( int i = 0; i < shapes.size ( ); i++ ) {
        if ( shapes [ i ]->Dependences ( ) != 0 ) {
            cout << i << " shape is container" << endl;
        } else {
            cout << i << " shape is leaf" << endl;
        }
    }
}

Код используется только для иллюстрации шаблона и не может использоваться в реальных приложениях (поэтому не объявлены деструкторы, не используются итераторы и так далее).
PM MAIL ICQ   Вверх
Zanoza
Дата 6.5.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.5.2007
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Спасибо за объяснения!!! Я недавно начала разбираться с ООП и всем остальным. Правильно ли я поняла, что контейнер это не только список, очередь, множество и т.д...но и любой произвольный класс в котором определена функция add?

Добавлено через 3 минуты и 39 секунд
adLucem, спасибо за код, но если честно я ничего не поняла, я пока не могу врубиться в саму идею ч то от меня требуется, я только недавно начала писать на с++ и пока еще многого не понимаю

Добавлено через 13 минут и 34 секунды
Подскажите пожалуйста, чтобы реализовать эту библиотеку мне нужно сделать Shape, от него наследовать все остальное в том числе Figure, потом реализовать в Figure функцию, добавляющую объект типа наследника Shape и потом создать объект типа Figure который будет этим самым контейнером который мне нужен? Я правильно поняла? 
PM MAIL   Вверх
nickless
Дата 6.5.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



В принципе, контейнер, это любой класс, смысл которого состоит в удобном хранении других объектов, как они туда попадают это не так важно.

ЗЫ. Почитай еще про полиморфизм 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Zanoza
Дата 6.5.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.5.2007
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Спасибо! Обязательно почитаю!
PM MAIL   Вверх
adLucem
Дата 6.5.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: нет
Всего: 5



Краткое объяснение.

Базовый класс Shape содержит один или несколько абстрактных методов, которые обеспечивают добавление элементов в контейнер (в моем случае чтобы не писать эти методы я просто использую vector и возвращаю его при вызови Dependences).
Все классы наследники, которые являются листовыми (то есть не являются контейнерами и не могут содержать других объектов) используют общее поведение по умолчанию (например, в моем коде возвращается нулевое значение вместо указателя коллекции элементов контейнера).
Все классы наследники, которые являются композитными ( то есть являются контейнерами и могут содержать другие объекты, в данном случае Figure ) реализуют управление коллекцией (например, в моем коде создают объект вектора).
Чтобы различать листья и композиты может использоваться специальная функция (например, IsLeaf или IsComposite) либо косвенные механизмы, например в моем коде проверяется, если указатель на коллекцию зависимых объектов равен нулю - то это листовой объект, в противном случае - композит.
PM MAIL ICQ   Вверх
Alexeis
Дата 15.5.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Zanoza, не создавайте дубликатов тем. Дублирующую тему в "Центре помощи" я удалил.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0954 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.