Menu
Coddy logo textTech

Итоги — класс Matrix

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 47 из 104.

challenge icon

Задание

Легко

Давайте создадим класс Matrix, который объединит все техники перегрузки операторов, изученные вами в этой главе. Вы создадите полнофункциональную матрицу, поддерживающую арифметические операции, сравнения, доступ к элементам и потоковый вывод — и все это через интуитивно понятный синтаксис операторов.

Вы организуете свой код в двух файлах:

  • Matrix.h: Определите класс Matrix, который управляет двумерным массивом целых чисел, используя динамическую память. Ваша матрица должна поддерживать:
    • Приватные члены: указатель int** для двумерных данных и члены типа size_t для строк и столбцов
    • Конструктор, который принимает количество строк и столбцов, инициализируя все элементы значением 0
    • Деструктор, который правильно освобождает всю выделенную память
    • Конструктор копирования и оператор присваивания копированием (глубокое копирование с проверкой на самоприсваивание)
    • Геттеры getRows() и getCols() (оба const)
    • Метод set(row, col, value) для установки отдельных элементов
    • Константный метод get(row, col) для получения элементов

    Реализуйте следующие операторы:

    • Арифметические: + и - для сложения и вычитания матриц (возвращают новый объект Matrix по значению)
    • Сравнения: == и != для проверки того, имеют ли две матрицы одинаковые размеры и идентичные элементы
    • Потоковый: << как дружественную функцию для вывода матрицы построчно, где элементы разделены пробелами, а каждая строка начинается с новой строки
    • Индексация: [], который возвращает указатель на строку, позволяя использовать синтаксис matrix[row][col] (предоставьте как константную, так и неконстантную версии)

    Для арифметических операторов предполагайте, что обе матрицы имеют одинаковые размеры. Операторы сравнения должны возвращать false, если размеры различаются.

  • main.cpp: Считайте входные данные для создания и манипулирования двумя матрицами 2x2. Формат входных данных:
    1. Четыре целых числа для первой матрицы (построчно): a00, a01, a10, a11
    2. Четыре целых числа для второй матрицы (построчно): b00, b01, b10, b11

    Создайте два объекта Matrix (по 2 строки и 2 столбца в каждом), заполните их с помощью метода set(), а затем продемонстрируйте работу ваших операторов:

    Формат вывода:

    Matrix A:
    <row0>
    <row1>
    Matrix B:
    <row0>
    <row1>
    A + B:
    <row0>
    <row1>
    A - B:
    <row0>
    <row1>
    A == B: <true/false>
    A != B: <true/false>
    A[0][0]: <value>
    A[1][1]: <value>

    Каждая строка должна отображать элементы, разделенные одиночными пробелами. Выводите true или false (строчными буквами) для результатов сравнения.

Например, при входных данных 1 2 3 4 для матрицы A и 5 6 7 8 для матрицы B:

Matrix A:
1 2
3 4
Matrix B:
5 6
7 8
A + B:
6 8
10 12
A - B:
-4 -4
-4 -4
A == B: false
A != B: true
A[0][0]: 1
A[1][1]: 4

Используйте std::stoi() для преобразования входных данных. Не забудьте реализовать != через ==, чтобы ваши операторы были согласованы. Не забудьте про include guards в вашем заголовочном файле.

Попробуйте сами

#include <iostream>
#include <string>
#include "Matrix.h"

using namespace std;

int main() {
    // Считать входные данные для первой матрицы (2x2): a00, a01, a10, a11
    int a00, a01, a10, a11;
    cin >> a00 >> a01 >> a10 >> a11;
    
    // Считать входные данные для второй матрицы (2x2): b00, b01, b10, b11
    int b00, b01, b10, b11;
    cin >> b00 >> b01 >> b10 >> b11;
    
    // TODO: Создать два объекта Matrix (по 2 строки и 2 столбца в каждом)
    
    // TODO: Заполнить матрицы, используя метод set()
    
    // TODO: Вывести матрицу A
    // cout << "Matrix A:" << endl;
    // Использовать оператор << для вывода матрицы
    
    // TODO: Вывести матрицу B
    // cout << "Matrix B:" << endl;
    // Использовать оператор << для вывода матрицы
    
    // TODO: Вывести A + B
    // cout << "A + B:" << endl;
    
    // TODO: Вывести A - B
    // cout << "A - B:" << endl;
    
    // TODO: Вывести результаты сравнения
    // cout << "A == B: " << (используйте тернарный оператор для true/false) << endl;
    // cout << "A != B: " << (используйте тернарный оператор для true/false) << endl;
    
    // TODO: Вывести результаты доступа по индексу
    // cout << "A[0][0]: " << ... << endl;
    // cout << "A[1][1]: " << ... << endl;
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование