This repository has been archived on 2023-05-13. You can view files and clone it, but cannot push or open issues or pull requests.
mipt_cpp/seminar02_encapsulation/classroom_tasks/code/1point/03setters_getters.cpp
2022-09-14 19:05:27 +03:00

124 lines
No EOL
4.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
До этого момента поля x и y класса Point были публичными
Обычно, мы не хотим делать поля публичными, так как мы не хотим, чтобы поля могли бы быть заданы некоректным значением извне класса.
Однако, в случае класса Point некорректных значений для x и y просто не существует - любое вещественное число будет
корректным для значения координаты точки.
Поэтому нет ничего плохого, чтобы сделать x и y публичными для класса Point
Но давайте сделаем класс с немного более сложным поведением.
Точка RestrictedPoint - это будет точка, которая может находится только в квадрате [0,1]x[0,1]
То есть поле x может принимать значения только от 0 до 1 и поле y может принимать значения только от 0 до 1.
Сделаем поля x и y приватными (и назовём их mx и my)
Теперь до них можно будет доступиться только в методах класса RestrictedPoint и в друзьях.
Чтобы можно было работать с этими полями вне класса напишем методы
getx, gety, setx, sety
Такие методы для получения полей и записи в поля класса называются геттерами и сеттерами
Функции getx и gety просто возвращают соответствующие координаты
Функции setx и sety меняют соответствующие координаты и следят, чтобы они находились в диапазоне от 0 до 1
Нам понадобится стандартная функция std::clamp из <algorithm>, которая принимает на вход три числа и
если первое число находится в промежутке между вторым и третьим, то clamp возвращает первое число
если первое число меньше, чем второе, то clamp возвращает второе число
если первое число больше, чем третье, то clamp возвращает третье число
Грубо говоря clamp ограничивает число в заданых пределах
*/
#include <iostream>
#include <cmath>
#include <algorithm>
using std::cout, std::endl;
class RestrictedPoint
{
private:
float mx, my;
public:
RestrictedPoint(float x, float y)
{
mx = std::clamp(x, 0.0f, 1.0f);
my = std::clamp(y, 0.0f, 1.0f);
}
RestrictedPoint()
{
mx = 0;
my = 0;
}
float getx() const
{
return mx;
}
float gety() const
{
return my;
}
void setx(float x)
{
mx = std::clamp(x, 0.0f, 1.0f);
}
void sety(float y)
{
my = std::clamp(y, 0.0f, 1.0f);
}
float norm() const
{
return std::sqrt(mx*mx + my*my);
}
RestrictedPoint operator+(const RestrictedPoint& right) const
{
RestrictedPoint result;
result.mx = std::clamp(mx + right.mx, 0.0f, 1.0f);
result.my = std::clamp(my + right.my, 0.0f, 1.0f);
return result;
}
};
std::ostream& operator<<(std::ostream& out, const RestrictedPoint& a)
{
out << "(" << a.getx() << ", " << a.gety() << ")";
return out;
}
int main()
{
RestrictedPoint a = RestrictedPoint(0.5, 1.2);
cout << a << endl;
a.setx(2);
cout << a << endl;
a.sety(-5);
cout << a << endl;
RestrictedPoint b = RestrictedPoint(0.4, 0.2);
RestrictedPoint c = RestrictedPoint(0.8, 0.4);
cout << c + b << endl;
}
/*
Задача:
1) Добавьте к классу RestrictedPoint оператор умножения на число типа float
*/