Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как лучше унаследовать "точка круг цилиндр"


Автор: PashaLost 6.11.2011, 20:10
Возможно эта тема уже тысячу раз обсуждалась, но к сожалению, ответа на неё я не нашёл. 
Итак. Нужно построить иерархию точка, круг, цилиндр.  Дейтел по этому поводу советует воспользоваться public наследованием и всё. Слышал я, что это не очень красиво, ибо точка это никак не круг, а круг это никак не цилиндр. Так каким наследованием унаследовать точку, круг и ?... Или не использовать наследование вовсе ? Тогда как их лучше связать?

Автор: Lateralus 6.11.2011, 20:19
Точка,круг,эллипс-по-моему, лучше так.

Автор: bsa 6.11.2011, 20:30
Цитата(PashaLost @  6.11.2011,  21:10 Найти цитируемый пост)
Слышал я, что это не очень красиво, ибо точка это никак не круг, а круг это никак не цилиндр.

все верно. это вообще разные объекты, которые имеют разные свойства и поведение.
Цитата(PashaLost @  6.11.2011,  21:10 Найти цитируемый пост)
Так каким наследованием унаследовать точку, круг и ?...
никак

Цитата(PashaLost @  6.11.2011,  21:10 Найти цитируемый пост)
Тогда как их лучше связать?
опять никак. точка - это одномерный объект, круг - двумерный, а цилиндр - трехмерный.

В принципе, круг - это вырожденный случай цилиндра (высота нулевая), а точка - вырожденный случай круга (радиус нулевой). Так что, это по сути один класс, но три разных объекта.

Автор: PashaLost 6.11.2011, 20:42
ну хорошо, передо мной стоит конкретная задача, связать эти три объекта в иерархию. Как мне это сделать, если обходиться без наследования ? 

Автор: newbee 6.11.2011, 20:52
Код

class point{
double x,y; // coords
}

class ellipse{
//тут описываешь формулу эллипса, в качестве длин используешь double,
//координатных точек - класс point.
}

class cylinder{
//аналогично, используя point и ellipse описываешь формулу цилиндра
}

Автор: bsa 6.11.2011, 20:55
PashaLost, иерархия подразумевает наследование. Если дано такое некорректное задание, то придется давать на него ответ: точка имеет три атрибута: X,Y,Z; и один виртуальный метод: нарисоваться. Круг добавляет атрибут радиус и углы наклона плоскости (в которой он размещен) относительно осей координат; переопределяет метод "нарисоваться". Цилиндр добавляет к кругу атрибут высота и переопределяет метод "нарисоваться".

Автор: PashaLost 6.11.2011, 21:15
А если я создам класс ФИГУРА, с полями X и Y.  Создам также классы ТОЧКА и КРУГЛАЯ ФИГУРА, которые будут открыто наследоваться от класса ФИГУРА. Класс Круглая фигура будет содержать в себе радиус. Создам классы КРУГ и ЦИЛИНДР, которые будут открыто наследоваться от класса КРУГЛАЯ ФИГУРА. Цилиндр будет содержать в себе только высоту. ??? 

Автор: mes 6.11.2011, 21:16
Цилиндр не круглая фигура.. 

Автор: PashaLost 6.11.2011, 21:18
Кстати, newbee, а что означает твой статус БРЕВНО ???

Добавлено через 1 минуту и 6 секунд
очень даже круглая, в ней ведь ЕСТЬ радиус и его (цилиндр), как и круг, можно спокойно покатить, значит круглая  smile 

Автор: mes 6.11.2011, 21:20
Цитата(PashaLost @  6.11.2011,  19:10 Найти цитируемый пост)
 Тогда как их лучше связать?

а, позвольте узнать, зачем их связывать ?
если потому, что просто надо, то обычным насдледованием..
если хотите, чтоб правильно было, то на данной стадии никак..

Добавлено @ 21:20
Цитата(PashaLost @  6.11.2011,  20:18 Найти цитируемый пост)
очень даже круглая, в ней ведь ЕСТЬ радиус и его (цилиндр), как и круг, можно спокойно покатить, значит круглая

тогда и машина круглая, ведь ее колеса круглые и она еще катится..

Автор: bsa 6.11.2011, 21:52
Цитата(PashaLost @  6.11.2011,  22:18 Найти цитируемый пост)
очень даже круглая, в ней ведь ЕСТЬ радиус и его (цилиндр), как и круг, можно спокойно покатить, значит круглая

есть понятие "тело вращения". Но оно относится только к трехмерным объектам. Кстати, эллипс - не подходит к твоей круглой фигуре.

Автор: PashaLost 6.11.2011, 22:09
я не знаю, кто приплёл этот эллипс, мне он не нужен. 
А вот кстати что у меня получилось, вроде всё работает ... но правильно ли я всё сделал ... 
Код

class Figure {                        
public:
    Figure(float, float);
    Figure();
    ~Figure();                                            
    void setXY(float, float);
    virtual void print() const=0;
protected:                                        
    float x;
    float y;
};

class Point: public Figure {                        
public:
    Point(float, float);
    Point();
    ~Point();                                            
    virtual void print() const;
};

class Round: public Figure {                        
public:
    Round(float, float, float);
    Round();
    ~Round();        
    void setR(float);
    virtual void print() const=0;
protected:
    float r;
};

class Circle: public Round {                        
public:
    Circle(float, float, float);
    Circle();
    ~Circle();                                            
    virtual void print() const;
};

class Cylinder: public Round {                        
public:
    Cylinder(float, float, float, float);
    Cylinder();
    ~Cylinder();    
    void setH(float);
    virtual void print() const;
private:
    float h;
};

Автор: borisbn 6.11.2011, 22:17
PashaLost, IMHO в этой иерархии Round лишний.
А задание, действительно, совершенно некорректное

Автор: de_Nis 6.11.2011, 22:29
Цитата(PashaLost @  6.11.2011,  20:10 Найти цитируемый пост)
 Нужно построить иерархию точка, круг, цилиндр

Может быть, имеет смысл почитать в книге
Миронченко Андрей Императивное и ООП программирование на Turbo Pascal и Delphi
раздел 16.5 Агрегация классов. Привожу выдержку:
"... В следующем примере мы построим 3 класса, описывающие геометрические фигуры в трехмерном пространстве: точка, круг и шар, используя агрегацию..."
И далее подробно описано, как и почему созданы классы, как они связаны друг с другом. Не думаю, что понимание кода на Паскале будет затруднительно - важна идея.
P.S. По поводу названия книги не уверен, автор указан точно. Книга есть в Сети.

Автор: newbee 6.11.2011, 22:44
Цитата(PashaLost @  6.11.2011,  23:09 Найти цитируемый пост)
я не знаю, кто приплёл этот эллипс, мне он не нужен. 
Я приплела, ведь окружность - частный случай эллипса. И вот тут было бы корректно использовать наследование эллипс-окружность.

Кстати, ТС, вон выше пишут о книге, где советуют использовать агрегацию. Выше я приводила код - как раз оно самое smile

ЗЫ, А бревно.. Ну потому что бревно.

Автор: bsa 6.11.2011, 23:20
Согласен, агрегация лучший вариант (точка, точка+радиус, точка+радиус+точка).
Цитата(newbee @  6.11.2011,  23:44 Найти цитируемый пост)
ЗЫ, А бревно.. Ну потому что бревно. 

такие интересные интимные подробности... нам, программистам, их действительно очень не хватает  smile 
 ! 
bsa
Отставить оффтопик

Автор: JackYF 8.11.2011, 20:18
Цитата(PashaLost @  6.11.2011,  20:18 Найти цитируемый пост)
Кстати, newbee, а что означает твой статус



M
JackYF
Не оффтопим.

Автор: Lols 8.11.2011, 21:59
Шар, а не цилиндр. Может, ошибка в задании?
С цилиндром мне что-то затруднительно, он ни разу не круглая фигура.

Автор: PashaLost 13.11.2011, 03:23
тему можно закрывать. всем спасибо!

Автор: bsa 13.11.2011, 10:47
Цитата(PashaLost @  13.11.2011,  04:23 Найти цитируемый пост)
тему можно закрывать. всем спасибо! 

Так пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)