Итоги — класс Matrix
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 47 из 104.
Задание
ЛегкоДавайте создадим класс Matrix, объединяющий все изученные в этой главе методы перегрузки операторов. Вы создадите полнофункциональную матрицу, поддерживающую арифметические операции, сравнения, доступ к элементам и вывод в поток — и всё это с помощью интуитивно понятного синтаксиса операторов.
Организуйте код в двух файлах:
Matrix.h: Определите классMatrix, который управляет двумерным массивом целых чисел с использованием динамической памяти. Ваша матрица должна поддерживать:- Приватные члены: указатель
int**для двумерных данных и члены типаsize_tдля строк и столбцов - конструктор, принимающий количество строк и столбцов и инициализирующий все элементы значением 0
- деструктор, корректно освобождающий всю выделенную память
- конструктор копирования и оператор присваивания копированием (глубокое копирование с проверкой самоприсваивания)
- геттеры
getRows()иgetCols()(обаconst) - метод
set(row, col, value)для установки отдельных элементов - метод
get(row, col)с квалификаторомconstдля получения элементов
Реализуйте следующие операторы:
- Арифметические:
+и-для сложения и вычитания матриц (возвращают новый объект Matrix по значению) - Сравнения:
==и!=для проверки того, что две матрицы имеют одинаковые размеры и идентичные элементы - Потоковый:
<<в качестве дружественной функции для вывода матрицы построчно, с разделением элементов пробелами и переходом каждой строки на новую строку - Индексации:
[], возвращающий указатель на строку и позволяющий использовать синтаксисmatrix[row][col](предоставьте версии и сconst, и без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(в нижнем регистре).
Например, если ввести 1 2 3 4 для Matrix A и 5 6 7 8 для Matrix 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 <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: Вывести Matrix A
// cout << "Matrix A:" << endl;
// Использовать оператор << для вывода матрицы
// TODO: Вывести Matrix 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++