Загрузка данных


#include <iostream>

using namespace std;

class matrix; // Предварительное объявление

class vect {
private:
    int* p;
    int size;
public:
    vect(int s = 0) {
        size = s;
        if (s > 0) {
            p = new int[s];
            for (int i = 0; i < s; i++) p[i] = 0;
        } else {
            p = nullptr;
        }
    }

    // Деструктор для очистки памяти
    ~vect() {
        delete[] p;
    }

    // Конструктор копирования (важен для возврата из функций)
    vect(const vect& other) {
        size = other.size;
        p = new int[size];
        for (int i = 0; i < size; i++) p[i] = other.p[i];
    }

    // Оператор присваивания
    vect& operator=(const vect& other) {
        if (this != &other) {
            delete[] p;
            size = other.size;
            p = new int[size];
            for (int i = 0; i < size; i++) p[i] = other.p[i];
        }
        return *this;
    }

    void in() {
        for (int i = 0; i < size; i++) {
            cout << "vect[" << i << "] = ";
            cin >> p[i];
        }
    }

    void out() const {
        cout << "vect: ";
        for (int i = 0; i < size; i++)
            cout << p[i] << " ";
        cout << endl;
    }

    int getSize() const { return size; }

    // Обычный оператор доступа
    int& operator[](int index) { return p[index]; }

    // КОНСТАНТНЫЙ оператор доступа (нужен для работы в operator*)
    int operator[](int index) const { return p[index]; }

    friend vect operator*(const vect& v, const matrix& m);
};

class matrix {
private:
    int** base;
    int column_size, row_size;
public:
    matrix(int row = 0, int col = 0) {
        row_size = row;
        column_size = col;
        base = new int* [row];
        for (int i = 0; i < row; i++) {
            base[i] = new int[col];
            for (int j = 0; j < col; j++)
                base[i][j] = 0;
        }
    }

    ~matrix() {
        for (int i = 0; i < row_size; i++) delete[] base[i];
        delete[] base;
    }

    void in() {
        for (int i = 0; i < row_size; i++) {
            for (int j = 0; j < column_size; j++) {
                cout << "matrix[" << i << "][" << j << "] = ";
                cin >> base[i][j];
            }
        }
    }

    void out() const {
        cout << "Matrix: " << endl;
        for (int i = 0; i < row_size; i++) {
            for (int j = 0; j < column_size; j++)
                cout << base[i][j] << " ";
            cout << endl;
        }
    }

    int getColumnSize() const { return column_size; }
    int getRowSize() const { return row_size; }
    int** getBase() const { return base; }

    friend vect operator*(const vect& v, const matrix& m);
};

vect operator*(const vect& v, const matrix& m) {
    if (v.getSize() != m.getRowSize()) {
        cout << "Error: Dimension mismatch!" << endl;
        return vect(0);
    }

    vect rez(m.getColumnSize());
    for (int j = 0; j < m.getColumnSize(); j++) {
        rez[j] = 0; // Теперь работает, так как rez не константный
        for (int i = 0; i < m.getRowSize(); i++) {
            // v[i] теперь работает, так как мы добавили константный operator[]
            rez[j] += v[i] * m.getBase()[i][j];
        }
    }
    return rez;
}

int main() {
    setlocale(LC_ALL, "Russian"); // Для корректного вывода кириллицы

    vect v(3);
    matrix m(3, 2);

    cout << "Enter vector elements (size 3):" << endl;
    v.in();
    cout << endl;

    cout << "Enter matrix elements (3x2):" << endl;
    m.in();
    cout << endl;

    v.out();
    m.out();

    vect r = v * m;
    cout << "Result of v * m:" << endl;
    r.out();

    return 0;
}