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

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

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

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

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

Не по теме:

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


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

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

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.10.2011, 23:57     Наследование от 2Д или 3Д фигур #15
Riderik, с точки зрения программирования да, но не с точки зрения проектирование (что более важно и чему, по идее, и следует обучиться в курсе).
Yandex
Объявления
24.10.2011, 23:57     Наследование от 2Д или 3Д фигур
Ответ Создать тему
Опции темы

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