124 lines
No EOL
4.4 KiB
C++
124 lines
No EOL
4.4 KiB
C++
/*
|
||
До этого момента поля 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
|
||
|
||
*/ |