Загрузка данных
Ниже — пример реализации на C++ класса VECTOR2 (вектор в 2D) и производного класса VECTOR3 (вектор в 3D) с указанными методами и перегрузками операторов.
Коротко реализовано:
• конструкторы с параметрами,
• display() для вывода координат,
• умножение/деление на число,
• сложение/вычитание векторов,
• скалярное произведение (оператор * между двумя векторами),
• сравнение (оператор ==),
• статический метод combine для вычисления c = k*a + m*b,
• класс VECTOR3 наследует VECTOR2, добавляет z и переопределяет операторы для 3D.
Код:
#include <iostream>
#include <cmath>
#include <stdexcept>
const double EPS = 1e-9;
class VECTOR2 {
protected:
double x, y;
public:
// Конструкторы
VECTOR2(double x_ = 0.0, double y_ = 0.0) : x(x_), y(y_) {}
// Вывод координат
virtual void display() const {
std::cout << "(" << x << ", " << y << ")";
}
// Операции сложения и вычитания
VECTOR2 operator+(const VECTOR2 other) const {
return VECTOR2(x + other.x, y + other.y);
}
VECTOR2 operator-(const VECTOR2 other) const {
return VECTOR2(x - other.x, y - other.y);
}
// Умножение на число (вектор * число)
VECTOR2 operator*(double k) const {
return VECTOR2(x * k, y * k);
}
// Деление на число
VECTOR2 operator/(double k) const {
if (std::fabs(k) < EPS) throw std::runtime_error("Division by zero");
return VECTOR2(x / k, y / k);
}
// Скалярное произведение (вектор * вектор)
double operator*(const VECTOR2 other) const {
return x * other.x + y * other.y;
}
// Сравнение
bool operator==(const VECTOR2 other) const {
return (std::fabs(x - other.x) < EPS) & (std::fabs(y - other.y) < EPS);
}
// Статический метод: c = k*a + m*b
static VECTOR2 combine(double k, const VECTOR2 a, double m, const VECTOR2 b) {
return a * k + b * m; // использует operator*(double)
}
// Доступ к компонентам (при необходимости)
double getX() const { return x; }
double getY() const { return y; }
// Дружественная функция для поддержания записи: double * VECTOR2
friend VECTOR2 operator*(double k, const VECTOR2 v) {
return v * k;
}
};
class VECTOR3 : public VECTOR2 {
private:
double z;
public:
// Конструкторы (инициализирует часть базового класса через список инициализации)
VECTOR3(double x_ = 0.0, double y_ = 0.0, double z_ = 0.0)
: VECTOR2(x_, y_), z(z_) {}
// Конструктор с инициализатором, принимающий VECTOR2 и z
VECTOR3(const VECTOR2 v2, double z_ = 0.0) : VECTOR2(v2), z(z_) {}
// Переопределение display
void display() const override {
std::cout << "(" << x << ", " << y << ", " << z << ")";
}
// Операции для 3D (возвращают VECTOR3)
VECTOR3 operator+(const VECTOR3 other) const {
return VECTOR3(x + other.x, y + other.y, z + other.z);
}
VECTOR3 operator-(const VECTOR3 other) const {
return VECTOR3(x - other.x, y - other.y, z - other.z);
}
// Умножение на число (вектор * число)
VECTOR3 operator*(double k) const {
return VECTOR3(x * k, y * k, z * k);
}
VECTOR3 operator/(double k) const {
if (std::fabs(k) < EPS) throw std::runtime_error("Division by zero");
return VECTOR3(x / k, y / k, z / k);
}
// Скалярное произведение (вектор * вектор) в 3D
double operator*(const VECTOR3 other) const {
return x * other.x + y * other.y + z * other.z;
}
bool operator==(const VECTOR3 other) const {
return (std::fabs(x - other.x) < EPS)
& (std::fabs(y - other.y) < EPS)
& (std::fabs(z - other.z) < EPS);
}
static VECTOR3 combine(double k, const VECTOR3 a, double m, const VECTOR3 b) {