Итоги — класс Matrix
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 47 из 104.
Задание
ЛегкоДавайте создадим класс 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. Формат входных данных:- Четыре целых числа для первой матрицы (построчно): 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 для матрицы 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;
}
Все уроки раздела Объектно-ориентированное программирование
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Итоги — Обобщенный контейнер