Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Простейшая композиция по значению
Ниже представлен класс для точки в 3-х мерном пространстве:
point3d.hpp
#ifndef _POINT3D_HPP_ #define _POINT3D_HPP_
//************************************************************************
class Point3D {
/*-----------------------------------------------------------------*/
public:
/*-----------------------------------------------------------------*/
// Конструктор по умолчанию – задает начало координат Point3D ();
// Конструктор с аргументами — задает конкретные значения координат Point3D (double _x, double _y, double _z);
// Методы доступа к координатам double getX () const; double getY () const; double getZ () const;
// Метод вычисления расстояния до другой точки double distanceTo (Point3D _p) const;
// Перегруженные операторы сравнения на равенство и неравенство bool operator == (Point3D _p) const; bool operator!= (Point3D _p) const;
/*-----------------------------------------------------------------*/
private:
/*-----------------------------------------------------------------*/
// Координаты точки по каждой из осей double m_x, m_y, m_z; };
//************************************************************************
// Метод доступа к координате по оси абсцисс inline double Point3D::getX () const { return m_x; }
//************************************************************************
// Метод доступа к координате по оси ординат inline double Point3D::getY () const { return m_y; }
//************************************************************************
// Метод доступа к координате по оси аппликат inline double Point3D::getZ () const { return m_z; }
//************************************************************************
#endif // _POINT3D_HPP
point3d.cpp
#include "point3d.hpp" #include <cmath>
//************************************************************************
// Реализация конструктора по умолчанию Point3D::Point3D () :m_x(0.0), m_y(0.0), m_z(0.0) { }
//************************************************************************
// Реализация конструктора с аргументами Point3D::Point3D (double _x, double _y, double _z) :m_x(_x), m_y(_y), m_z(_z) { }
//************************************************************************
// Реализация метода вычисления расстояния до другой дочки double Point3D::distanceTo (Point3D _p) const { double xDiff = _p.getX() - getX(); double yDiff = _p.getY() - getY(); double zDiff = _p.getZ() - getZ(); return sqrt(xDiff * xDiff + yDiff * yDiff + zDiff * zDiff); }
//************************************************************************
// Реализация оператора сравнения на равенство bool Point3D:: operator == (Point3D _p) const { return getX() == _p.getX() && getY() == _p.getY() && getZ() == _p.getZ(); }
//************************************************************************
// Реализация оператора сравнения на равенство bool Point3D:: operator!= (Point3D _p) const {
return!(* this == _p); }
//************************************************************************
Класс для окружности использует реализованный выше класс для точки для дочернего объекта, означающего координаты центра. Точка хранится в окружности по значению и не может быть отделена от окружности:
circle.hpp
#ifndef _CIRCLE_HPP_ #define _CIRCLE_HPP_
//************************************************************************
#include "point3d.hpp"
//************************************************************************
class Circle { /*-----------------------------------------------------------------*/
public:
/*-----------------------------------------------------------------*/
// Конструктор Circle (Point3D _center, double _radius);
// Метод доступа к координатам центра Point3D getCenter () const;
// Метод доступа к радиусу double getRadius () const;
// Метод вычисления длины окружности double getPerimeter () const;
// Метод вычисления площади окружности double getArea () const;
// Метод вычисления координаты точки на окружности под определенным углом Point3D getPointOn (double _angle) const;
/*-----------------------------------------------------------------*/
private:
/*-----------------------------------------------------------------*/
// Центр окружности — дочерний объект класса Point3D Point3D m_center;
// Радиус окружности double m_radius;
/*-----------------------------------------------------------------*/
};
//************************************************************************
// Реализация метода доступа к координатам центра inline Point3D Circle::getCenter () const { return m_center; }
//************************************************************************
// Реализация метода доступа к радиусу Inline double Circle::getRadius () const { return m_radius; }
//************************************************************************
#endif // _CIRCLE_HPP_
circle.cpp
#include "circle.hpp"
#define _USE_MATH_DEFINES // <- необходимо для работы с константой M_PI #include <cmath>
#include <stdexcept>
//************************************************************************
// Реализация конструктора Circle::Circle (Point3D _center, double _radius) : m_center(_center) // <= вызов конструктора копий Point3D , m_radius(_radius) { // Инвариант: радиус должен быть положительным if (m_radius <= 0.0) throw std::logic_error("Circle radius must be positive"); }
//************************************************************************
// Реализация метода вычисления длины окружности double Circle::getPerimeter () const { return 2.0 * M_PI * m_radius; }
//************************************************************************
// Реализация метода вычисления площади окружности double Circle::getArea () const { return M_PI * m_radius * m_radius; }
//************************************************************************
// Реализация метода вычисления координат точки на окружности под заданным углом Point3D Circle::getPointOn (double _angle) const { // Вычисляем длины катетов по гипотенузе (радиусу) и углу double xOffset = m_radius * cos(_angle); double yOffset = m_radius * sin(_angle);
// Создаем новый объект-точку return Point3D(m_center.getX() + xOffset, m_center.getY() + yOffset, m_center.getZ() ); }
//************************************************************************
В свою очередь, класс-цилиндр использует в качестве дочернего объекта окружности для моделирования основания. Аналогично предыдущему случаю, дочерний объект-окружность хранится в объекте-цилиндре по значению. А значит внутри объекта-цилиндра есть и объект-точка, представляющая собой центр окружности-основания:
cylinder.hpp
#ifndef _CYLINDER_HPP_ #define _CYLINDER_HPP_
//************************************************************************
#include " circle.hpp"
//************************************************************************
class Cylinder { /*-----------------------------------------------------------------*/
public:
/*-----------------------------------------------------------------*/
// Конструктор. Передаем основание по ссылке. // Передача основания по значению также допустима. Cylinder (Circle _base, double _height);
// Метод доступа к объекту-основанию Circle getBase () const;
// Метод доступа к высоте цилиндра double getHeight () const;
// Метод вычисления объема цилиндра double getVolume () const;
// Метод вычисления площади поверхности сторон double getSideSurfaceArea () const;
// Метод вычисления всей площади поверхности double getFullSurfaceArea () const;
// Метод вычисления координат точки на поверхности под определенным углом // и на заданной высоте Point3D getPointOnSurface (double _angle, double _height) const;
/*-----------------------------------------------------------------*/
private:
/*-----------------------------------------------------------------*/
// Основание цилиндра — дочерний объект класса Circle Circle m_base;
// Высота цилиндра double m_height;
/*-----------------------------------------------------------------*/
};
//************************************************************************
// Реализация метода доступа к объекту-основания inline Circle Cylinder::getBase () const { return m_base; }
//************************************************************************
// Реализация метода доступа к высоте Inline double Cylinder::getHeight () const { return m_height; }
//************************************************************************
#endif // _CYLINDER_HPP_
cylinder.cpp
//************************************************************************
#include "cylinder.hpp" #include <cmath> #include <stdexcept>
//************************************************************************
// Реализация конструктора Cylinder::Cylinder (const Circle & _base, double _height) : m_base(_base) // <= вызов конструктора копий класса Circle , m_height(_height) { // Инвариант: высота должна быть положительной if (m_height <= 0.0) throw std::logic_error("Cylinder height must be positive"); }
//************************************************************************
// Реализация метода вычисления объема double Cylinder::getVolume () const { return m_base.getArea() * m_height; }
//************************************************************************
// Реализация метода вычисления площади поверхности сторон double Cylinder::getSideSurfaceArea () const { return m_base.getPerimeter() * m_height; }
//************************************************************************
// Реализация метода вычисления площади полной поверхности double Cylinder::getFullSurfaceArea () const { return getSideSurfaceArea() + 2.0 * m_base.getArea();
}
//************************************************************************
// Реализация метода вычисления координат точки на поверхности Point3D Cylinder::getPointOnSurface (double _angle, double _height) const { // Вычисляем координаты точки на основании Point3D circlePoint = m_base.getPointOn(_angle);
// Создаем новую точку с учетом высоты return Point3D(circlePoint.getX(), }
//************************************************************************
|
|||||||
Последнее изменение этой страницы: 2017-02-17; просмотров: 160; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.14.53 (0.056 с.) |