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