Класс Лоренц-векторов
Реализуйте класс 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