C++ и Python

Лоренц-вектор (4)

Класс Лоренц-векторов

Реализуйте класс LorentzVector, описывающий Лоренц-векторы и содержащий

  1. Конструктор по умолчанию и конструктор из четырех переменных double.
  2. Методы доступа и модификации компонент вектора (t, x, y, z).
  3. Перегруженные операторы:
    • Оператор получения элемента по индексу ([]).
    • Арифметические операторы:
      • Унарного плюса и минуса (+ и -).
      • Сложения (+ и +=).
      • Вычитания (- и -=).
      • Умножения вектора на скаляр (* и *=) и скаляра на вектор (*).
    • Операторы ввода и вывода:
      • Чтения компонент из потока (>>).
      • Вывода компонент в поток (<<).
  4. Методы, реализующие операции:
    • Скалярное произведение векторов (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