Podsumowanie — klasa Matrix
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 47 z 104.
Wyzwanie
ŁatwyZbudujmy klasę Matrix, która łączy wszystkie poznane w tym rozdziale techniki przeciążania operatorów. Utworzysz w pełni funkcjonalną macierz obsługującą operacje arytmetyczne, porównania, dostęp do elementów i wypisywanie do strumienia — wszystko za pomocą intuicyjnej składni operatorów.
Rozmieścisz swój kod w dwóch plikach:
Matrix.h: Zdefiniuj klasęMatrix, która zarządza dwuwymiarową tablicą liczb całkowitych przy użyciu pamięci dynamicznej. Twoja macierz powinna obsługiwać:- Prywatne składowe: wskaźnik
int**do danych 2D oraz składowesize_tokreślające liczbę wierszy i kolumn - Konstruktor przyjmujący liczbę wierszy i kolumn, inicjalizujący wszystkie elementy wartością 0
- Destruktor, który prawidłowo zwalnia całą zaalokowaną pamięć
- Konstruktor kopiujący i operator przypisania kopiującego (głęboka kopia z kontrolą przypisania do samego siebie)
- Gettery
getRows()igetCols()(oba const) - Metodę
set(row, col, value)do ustawiania poszczególnych elementów - Metodę
get(row, col)const do pobierania elementów
Zaimplementuj następujące operatory:
- Arytmetyczne:
+i-do dodawania i odejmowania macierzy (zwracają nową macierz przez wartość) - Porównania:
==i!=do sprawdzania, czy dwie macierze mają takie same wymiary i identyczne elementy - Strumieniowy:
<<jako funkcję zaprzyjaźnioną do wypisywania macierzy wiersz po wierszu, z elementami oddzielonymi spacjami i każdym wierszem w nowej linii - Indeksowania:
[], który zwraca wskaźnik do wiersza, umożliwiając składnięmatrix[row][col](udostępnij zarówno wersję const, jak i nie-const)
W przypadku operatorów arytmetycznych załóż, że obie macierze mają takie same wymiary. Operatory porównania powinny zwracać
false, jeśli wymiary się różnią.- Prywatne składowe: wskaźnik
main.cpp: Wczytaj dane wejściowe, aby utworzyć i modyfikować dwie macierze 2x2. Format danych wejściowych:- Cztery liczby całkowite dla pierwszej macierzy (wiersz po wierszu): a00, a01, a10, a11
- Cztery liczby całkowite dla drugiej macierzy (wiersz po wierszu): b00, b01, b10, b11
Utwórz dwa obiekty
Matrix(każdy o 2 wierszach i 2 kolumnach), wypełnij je za pomocą metodyset(), a następnie pokaż działanie operatorów:Format wyjściowy:
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>Elementy każdego wiersza powinny być oddzielone pojedynczymi spacjami. Dla wyników porównań wypisz
truelubfalse(małymi literami).
Na przykład, dla danych wejściowych 1 2 3 4 dla macierzy A oraz 5 6 7 8 dla 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]: 4Użyj std::stoi() do konwersji danych wejściowych. Pamiętaj, aby zaimplementować != w oparciu o ==, dzięki czemu operatory będą spójne. Nie zapomnij o strażnikach nagłówka w pliku nagłówkowym.
Spróbuj swoich sił
#include <iostream>
#include <string>
#include "Matrix.h"
using namespace std;
int main() {
// Wczytaj dane wejściowe dla pierwszej macierzy (2x2): a00, a01, a10, a11
int a00, a01, a10, a11;
cin >> a00 >> a01 >> a10 >> a11;
// Wczytaj dane wejściowe dla drugiej macierzy (2x2): b00, b01, b10, b11
int b00, b01, b10, b11;
cin >> b00 >> b01 >> b10 >> b11;
// TODO: Utwórz dwa obiekty Matrix (każdy o 2 wierszach i 2 kolumnach)
// TODO: Wypełnij macierze za pomocą metody set()
// TODO: Wyświetl macierz A
// cout << "Matrix A:" << endl;
// Użyj operatora <<, aby wyświetlić macierz
// TODO: Wyświetl macierz B
// cout << "Matrix B:" << endl;
// Użyj operatora <<, aby wyświetlić macierz
// TODO: Wyświetl A + B
// cout << "A + B:" << endl;
// TODO: Wyświetl A - B
// cout << "A - B:" << endl;
// TODO: Wyświetl wyniki porównań
// cout << "A == B: " << (użyj operatora trójargumentowego dla true/false) << endl;
// cout << "A != B: " << (użyj operatora trójargumentowego dla true/false) << endl;
// TODO: Wyświetl wyniki dostępu przez indeksy
// cout << "A[0][0]: " << ... << endl;
// cout << "A[1][1]: " << ... << endl;
return 0;
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online