Лоренц-вектор (4)
Класс Лоренц-векторов
Реализуйте класс LorentzVector
, описывающий Лоренц-векторы и содержащий
- Конструктор по умолчанию и конструктор из четырех переменных
double
. - Методы доступа и модификации компонент вектора (
t
,x
,y
,z
). - Перегруженные операторы:
- Оператор получения элемента по индексу (
[]
). - Арифметические операторы:
- Унарного плюса и минуса (
+
и-
). - Сложения (
+
и+=
). - Вычитания (
-
и-=
). - Умножения вектора на скаляр (
*
и*=
) и скаляра на вектор (*
).
- Унарного плюса и минуса (
- Операторы ввода и вывода:
- Чтения компонент из потока (
>>
). - Вывода компонент в поток (
<<
).
- Чтения компонент из потока (
- Оператор получения элемента по индексу (
- Методы, реализующие операции:
- Скалярное произведение векторов (
dot
). - Нахождение нормы вектора (
norm
). - Преобразование в систему, движущуюся со скоростью βc вдоль оси z (
zshift
).
- Скалярное произведение векторов (
Определение класса LorentzVector
приведено в файле LorentzVector.h
.
Указания
- Определение классов потоков ввода и вывода находятся в заголовочном файле
<iostream>
. - Реализуйте инкапсуляцию данных (пользователь не знает как конкретно хранятся данные в вашем классе, а все манипуляции с компонентами вектора могут производиться только с помощью методов класса).
- Объявляйте константными методы, которые не изменяют состояние объекта.
- Избегайте копирования при передаче вектора в качестве аргумента функции (метода). Используйте константные ссылки
const LorentzVector&
. - Разделите реализацию класса на два файла: заголовочный файл с объявлением класса
LorentzVector.h
и файл с реализацией методовLorentzVector.cpp
. - Операторы вывода в поток, чтения из потока и умножения константы на вектор не получится реализовать в виде метода класса
LorentzVector
, а только в виде отдельной функции. Если необходим доступ к приватным членамLorentzVector
, можно объявить этот оператор с помощью ключевого словаfriend
.
Примечания и уточнения
- Возможны как
+---
так и-+++
сигнатуры. - В
t
компоненте вектора должно лежать время, уже домноженное на скорость света. Это означает, что у вас в реализации скорость света нигде не должна фигурировать. - Конструктор по умолчанию
LorentzVector()
должен инициализировать компоненты вектора нулями. - Норма вектора определяется как скалярное произведение вектора самого на себя. Норма Лоренц-вектора может быть отризательной.
- При выводе с помощью оператора
<<
требуется, чтобы компоненты вектора были разделены символами", "
(запятая и пробел) и находились в фигурных скобках. Например,{0.9872, -0.1001, 0.2034, 0.2098}
. - При чтениии из потока ввода с помощью оператора
>>
предполагается, что вектор представлен в виде четырёх чисел, разделённых пробелами или переносом строк, (пример ввода:1e-4 0 1.5 -1
). Подсказка: просто четыре раза используйте оператор>>
для чтенияdouble
.
Как тестировать локально
Собрать программу с помощью cmake
и запустить ctest
:
mkdir build; cd build
cmake ..; cmake --build .
ctest -V