Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
#1

Наследование от 2Д или 3Д фигур - C++

24.10.2011, 20:58. Просмотров 1926. Ответов 19
Метки нет (Все метки)

Была задана задача: создать абстрактный класс Shape (фигура) с вычислением характеристики любой фигуры (площадь или объем) и выводом параметров. От него создать производные классы "2Д фигуры" и "3Д фигуры", также абстрактные. От класса "2Д фигуры" создать несколько производных классов - конкретных фигур. От класса "3Д фигуры", так же, создать несколько производных конкретных классов. Всё бы ничего, но вот я задумался над тем, что же будут наследовать конкретные фигуры из классов "2Д" и "3Д". Получается, что классы "2Д" и "3Д" должны содержать что-то свойственное всем двумерным и трехмерным соответственно. Мои рассуждения на этот счет: все 2Д фигуры родственны тем, что их можно изобразить на плоскости с помощью осей X и Y. Таким образом, я думаю, что можно сделать в "2Д" данные, содержащие выпуклость фигуры по осям X и Y. В "3Д" еще для оси Z. Рисовать фигуру не надо. Только посчитать площадь или объем. Может у кого мысли по-интереснее есть насчет классов "2Д" и "3Д"? Мне кажется сомнительным то что я надумал.
Прототипы:
Код
class Shape
{
protected:
	double SV; //площадь или объем
public:
	Shape();
	virtual ~Shape();
	virtual void print()=0;  //вывод параметров
	virtual void S_V()=0;  //рассчет площади или объема
};

class TwoD: public Shape
{
protected:
	double h,w;
public:
	TwoD(double H=0, double W=0);
	virtual ~TwoD()=0;
};

class ThreeD: public Shape
{
protected:
	double h,w,b;
public:
	ThreeD(double H=0, double W=0, double B=0);
	virtual ~ThreeD()=0;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 20:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование от 2Д или 3Д фигур (C++):

Множественное наследование графических фигур - C++
ВОТ Я ЗАКИНУЛ ЗАДАНИЕ У МЕНЯ ПО ВАРИАНТУ РОМБ...КТО МОЖЕТ ПОМОЧЬ!!! БЫЛ БЫ ОЧЕНЬ РАД... Я ЩАС И БЕЗ ЭТОГО 2 КУРСАЧА И 9 ЛАБ ДЕЛАЮ,...

Наследование.Геометрические фигуры.Коллекция геометрических фигур.Непонятна работа с массивом - C++
Всем доброго времени суток,у меня такое задание : Реализовать иерархию классов геометрических фигур. На вершине иерархии находится...

Определить какая из фигур – круг или квадрат - имеет большую площадь - C++
Помогите, составить программу, нужно определить какая из фигур – круг или квадрат - имеет большую площадь. Известно, что сторона...

Наследование в C++, или болезненный переход с Java - C++
Здравствуйте! Есть такая задача: нужно два класса, две разные реализации абстрактного родительского(т.е. в нём только объявление...

Наследование или создание класса в классе? - C++
У меня есть класс А и класс Б. В классе А я хочу создать объекты класса Б. Как лучше это сделать? Или лучше использовать наследование?

Определить, какая из фигур (круг или квадрат) имеет большую площадь и во сколько раз (используя if) - C++
Пусть заданы две фигуры- квадрат и круг. Квадрат задан значением стороны,а круг-радиуса. Определить, какая из фигур имеет большую площадь...

19
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
24.10.2011, 22:47 #2
Предлагаю следующую иерархию:
Класс фигура:
члены: площадь и объем
виртуальные функции: вычислить площадь и объем
Класс 2D
массив 2D точек/прямых из которых состоит эта фигура(x,y)
Класс 3D
массив 3D точек/прямых из которых состоит эта фигура(x,y,z)
Далее например квадрат и правильный треугольник из 2D с переопределением всего что надо, тоже самое с кубом и тетраэдром из 3D
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.10.2011, 22:50 #3
hepr, в вашей архитектуре у двухмерной фигуры может быть вычислен объем. Писать заглушку у всех фигур типа return 0.0; - не тру.
0
VadimTagil
14 / 14 / 1
Регистрация: 15.07.2011
Сообщений: 81
24.10.2011, 23:01 #4
виртуальные функции: вычислить площадь и объем
виртуальная функция bool GetMetric(float* x,METRIC_TYPE m);
C++
1
2
res=shape.GetMetric(&s,METRIC_SURFACE);
res=shape.GetMetric(&v,METRIC_VOLUME);
функция устанавливает значение требуемой ыеличины в указанную переменную. Для двумерной фигуры попытка вычислить объем возвр. FALSE
0
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
24.10.2011, 23:04 #5
Цитата Сообщение от silent_1991 Посмотреть сообщение
hepr, в вашей архитектуре у двухмерной фигуры может быть вычислен объем.
Ну так, а кто сказал что я не предлагаю это сделать, виртуальные функции вычисление S и V я предлагаю ввести еще на уровне фигуры
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.10.2011, 23:07 #6
Цитата Сообщение от hepr Посмотреть сообщение
Ну так, а кто сказал что я не предлагаю это сделать
Никто, я лишь сказал, что с моей точки зрения это неверно.
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.10.2011, 23:11  [ТС] #7
Цитата Сообщение от hepr Посмотреть сообщение
Предлагаю следующую иерархию:
Класс фигура:
члены: площадь и объем
виртуальные функции: вычислить площадь и объем
Класс 2D
массив 2D точек/прямых из которых состоит эта фигура(x,y)
Класс 3D
массив 3D точек/прямых из которых состоит эта фигура(x,y,z)
Далее например квадрат и правильный треугольник из 2D с переопределением всего что надо, тоже самое с кубом и тетраэдром из 3D
Такс.. Тут просто в чем дело: классы Фигура, 2Д и 3Д являются абстрактными. Т.е. объектов их не будет. Создаются объекты уже по каким-то данным для конкретных классов. Данные будут вводиться такие как: длинна, высота или радиус. Если делать предложенную реализацию классов 2Д и 3Д, как я понимаю, это будет не только намного сложнее, но и абсолютно бесполезно для данной задачи. Хотя идея в общем ничего. Или я, всё же, чего-то тут не понимаю.
0
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
24.10.2011, 23:11 #8

Не по теме:

Слабовато, товарищи форумчане. Покажите какую нибудь особую реализацию.


0
VadimTagil
14 / 14 / 1
Регистрация: 15.07.2011
Сообщений: 81
24.10.2011, 23:22 #9
Цитата Сообщение от Riderik Посмотреть сообщение
это будет не только намного сложнее, но и абсолютно бесполезно для данной задачи
ну да, в принципе у абстрактных классов можно не делать никаких переменных, пусть они работают как интерфейсы. У каждой конткретной яигкры сделать переменные: длина, ширина, радиус и др., какие в конкретной фигуре нужны
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.10.2011, 23:27  [ТС] #10
Цитата Сообщение от VadimTagil Посмотреть сообщение
ну да, в принципе у абстрактных классов можно не делать никаких переменных, пусть они работают как интерфейсы. У каждой конткретной яигкры сделать переменные: длина, ширина, радиус и др., какие в конкретной фигуре нужны
Получается что классы 2Д и 3Д для данной задачи бесполезны. Ведь интерфейс в классе Фигуры. Но всё же задание было именно с 2Д и 3Д. Есть вариант их оставить просто пустыми. Для виду чисто. Или использовать метод, как я предложил изначально: типа при создании класса "прямоугольник", можно просто в 2Д закидывать длину и ширину. И в новый класс ничего не добавлять. А при создании круга, можно в 2Д диаметр кинуть. Не очень так, но наверное лучше чем просто пустой класс?
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.10.2011, 23:31 #11
Riderik, самый банальный вариант - свитч типов. Делаем класс Figure пустым, от него наследуем TwoDimFigure и ThreeDimFigure, в каждом из которых определяем свои методы (например, в 2д - площадь, в 3д - площадь поверхности и объём), а при обработке пробуем dynamic_cast'ом примести указатель на конкретную фигуру к 2д и к 3д. К какому типу получилось привести - те действия и выполняем.
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.10.2011, 23:49  [ТС] #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
Riderik, самый банальный вариант - свитч типов. Делаем класс Figure пустым, от него наследуем TwoDimFigure и ThreeDimFigure, в каждом из которых определяем свои методы (например, в 2д - площадь, в 3д - площадь поверхности и объём), а при обработке пробуем dynamic_cast'ом примести указатель на конкретную фигуру к 2д и к 3д. К какому типу получилось привести - те действия и выполняем.
ну, по-идее, в идеале так и должно быть. Но здесь дело другое: это первая лаба по наследованию и препод сказала, что площадь поверхностей не нужна. В общем тут нужно просто показать знание темы. Вот идея насчет пустого базового класса мне понравилась. Однако перечитав задание нашел следующую строчку: "реализовать абстрактный класс Shape содержащий интерфейс иерархий". Выходит, что именно он должен быть интерфейсом и пустым его оставить не получится. Да, задание странноватое :\
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.10.2011, 23:54 #13
Riderik, тога будет беда, если мы попробуем объём вычислить у двухмерной фигуры... Может ввести метод name, который будет возвращать название фигуры? тогда его можно будет включить в базовый класс Фигура и переопределить в наследниках обоих подтипов фигур.

Добавлено через 1 минуту
Правда Фигура не будет содержать полный интерфейс, но общий (что и требуется от этого класса) содержать будет.
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.10.2011, 23:56  [ТС] #14
Я сделал просто один метод с общим названием. В каждой фигуре он переопределен по-своему. Т.к. в 3Д не нужно считать площадь, а в 2Д не нужен объем, то одной функции, по-идее достаточно
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.10.2011, 23:57 #15
Riderik, с точки зрения программирования да, но не с точки зрения проектирование (что более важно и чему, по идее, и следует обучиться в курсе).
0
24.10.2011, 23:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2011, 23:57
Привет! Вот еще темы с ответами:

Структура программы или наследование, без использования конструктора базового класса - C++
Всем доброго времени суток. Снова прошу вас о помощи! Код располагается по ссылке в спойлере - не вставлю сюда, так как слишком...

правильное наследование геометрических фигур - ООП и паттерны
Дана задача разработать классы для 2д фигур. Когда то мой преподаватель по ООП говорил, что наследование геометрических фигур задача...

Рисовалка геометрических фигур - WinForms или WPF? - C#
Здравствуйте. У меня имеется задание - нарисовать небольшую рисовалку, в которой будет реализован следующий функционал: 1) В программе...

Интерфейсы или наследование - C#
Добрый день, помогите с реализацией программы: Я хочу написать в консоли мини-игрушку. В ней должен быть класс Человек, класс Башня и два...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru