Итоги — класс Matrix
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 47 из 104.
Задание
ЛегкоДавайте создадим класс Matrix, который объединяет все изученные в этой главе приёмы перегрузки операторов. Вы создадите полноценную матрицу с поддержкой арифметических операций, сравнений, доступа к элементам и вывода в поток — и всё это с помощью интуитивно понятного синтаксиса операторов.
Ваш код будет состоять из двух файлов:
Matrix.h: Определите классMatrix, который управляет двумерным массивом целых чисел с использованием динамической памяти. Ваша матрица должна поддерживать:- Закрытые поля: указатель
int**для двумерных данных и поля типаsize_tдля количества строк и столбцов - Конструктор, принимающий количество строк и столбцов и инициализирующий все элементы значением 0. Выделите массив указателей на строки, а затем каждую строку:
data = new int*[rows];иdata[r] = new int[cols];для каждой строкиr - Деструктор, который корректно освобождает всю выделенную память: сначала выполните
delete[]для каждой строки, затемdelete[] data; - Конструктор копирования и оператор присваивания копированием (глубокое копирование с проверкой на самоприсваивание)
- Геттеры
getRows()иgetCols()(оба с квалификатором const) - Метод
set(row, col, value)для установки отдельных элементов - Метод
get(row, col)с квалификатором const для получения элементов
Реализуйте следующие операторы:
- Арифметические:
+и-для сложения и вычитания матриц (возвращают новую матрицу по значению) - Сравнения:
==и!=для проверки, имеют ли две матрицы одинаковые размеры и идентичные элементы - Потоковый:
<<как дружественную функцию для вывода матрицы построчно, с элементами, разделёнными пробелами, и каждой строкой на новой строке - Индексирования:
[], возвращающий указатель на строку и позволяющий использовать синтаксисmatrix[row][col](предоставьте версии как с квалификатором const, так и без него)
Для арифметических операторов считайте, что обе матрицы имеют одинаковые размеры. Операторы сравнения должны возвращать
false, если размеры отличаются.- Закрытые поля: указатель
main.cpp: Считайте входные данные для создания и обработки двух матриц размером 2x2. Формат входных данных:- Четыре целых числа для первой матрицы (построчно): a00, a01, a10, a11
- Четыре целых числа для второй матрицы (построчно): 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(строчными буквами).
Например, если для Matrix A введены 1 2 3 4, а для Matrix B: — 5 6 7 8
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Не забудьте реализовать != через ==, чтобы операторы работали согласованно. Не забудьте добавить защиту от повторного включения в заголовочный файл.
Попробуйте сами
#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;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнерПотренируйтесь самостоятельно: Онлайн-компилятор C++