Rückblick - Matrix-Klasse
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 47 von 104.
Aufgabe
EinfachLassen Sie uns eine Matrix-Klasse erstellen, die alle Techniken zur Überladung von Operatoren vereint, die Sie in diesem Kapitel gelernt haben. Sie werden eine voll funktionsfähige Matrix erstellen, die arithmetische Operationen, Vergleiche, Elementzugriff und Stream-Ausgabe unterstützt — alles über eine intuitive Operator-Syntax.
Sie werden Ihren Code auf zwei Dateien verteilen:
Matrix.h: Definieren Sie eineMatrix-Klasse, die ein 2D-Array von Ganzzahlen unter Verwendung von dynamischem Speicher verwaltet. Ihre Matrix sollte Folgendes unterstützen:- Private Member: ein
int**-Zeiger für die 2D-Daten undsize_t-Member für Zeilen und Spalten - Ein Konstruktor, der Zeilen und Spalten entgegennimmt und alle Elemente mit 0 initialisiert
- Ein Destruktor, der den gesamten zugewiesenen Speicher ordnungsgemäß freigibt
- Ein Kopierkonstruktor und ein Kopierzuweisungsoperator (tiefe Kopie mit Prüfung auf Selbstzuweisung)
- Getter
getRows()undgetCols()(beide const) - Eine
set(row, col, value)-Methode zum Setzen einzelner Elemente - Eine
get(row, col)-const-Methode zum Abrufen von Elementen
Implementieren Sie diese Operatoren:
- Arithmetik:
+und-für Matrix-Addition und -Subtraktion (geben Sie eine neue Matrix als Wert zurück) - Vergleich:
==und!=, um zu prüfen, ob zwei Matrizen die gleichen Dimensionen und identische Elemente haben - Stream:
<<als Friend-Funktion, um die Matrix zeilenweise auszugeben, wobei die Elemente durch Leerzeichen getrennt sind und jede Zeile in einer neuen Zeile steht - Subskript:
[], der einen Zeiger auf eine Zeile zurückgibt und so diematrix[row][col]-Syntax ermöglicht (stellen Sie sowohl const- als auch nicht-const-Versionen bereit)
Gehen Sie bei arithmetischen Operatoren davon aus, dass beide Matrizen die gleichen Dimensionen haben. Vergleichsoperatoren sollten
falsezurückgeben, wenn sich die Dimensionen unterscheiden.- Private Member: ein
main.cpp: Lesen Sie die Eingabe ein, um zwei 2x2-Matrizen zu erstellen und zu manipulieren. Das Eingabeformat ist:- Vier Ganzzahlen für die erste Matrix (zeilenweise): a00, a01, a10, a11
- Vier Ganzzahlen für die zweite Matrix (zeilenweise): b00, b01, b10, b11
Erstellen Sie zwei
Matrix-Objekte (jeweils 2 Zeilen, 2 Spalten), füllen Sie diese mit derset()-Methode und demonstrieren Sie dann Ihre Operatoren:Ausgabeformat:
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>Jede Zeile sollte die Elemente durch einzelne Leerzeichen getrennt anzeigen. Geben Sie
trueoderfalse(kleingeschrieben) für Vergleichsergebnisse aus.
Zum Beispiel mit den Eingaben 1 2 3 4 für Matrix A und 5 6 7 8 für 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]: 4Verwenden Sie std::stoi() für die Eingabekonvertierung. Denken Sie daran, != in Abhängigkeit von == zu implementieren, um Ihre Operatoren konsistent zu halten. Vergessen Sie nicht die Header-Guards in Ihrer Header-Datei.
Probier es selbst
#include <iostream>
#include <string>
#include "Matrix.h"
using namespace std;
int main() {
// Eingabe für die erste Matrix (2x2) lesen: a00, a01, a10, a11
int a00, a01, a10, a11;
cin >> a00 >> a01 >> a10 >> a11;
// Eingabe für die zweite Matrix (2x2) lesen: b00, b01, b10, b11
int b00, b01, b10, b11;
cin >> b00 >> b01 >> b10 >> b11;
// TODO: Zwei Matrix-Objekte erstellen (jeweils 2 Zeilen, 2 Spalten)
// TODO: Matrizen mit der Methode set() befüllen
// TODO: Matrix A ausgeben
// cout << "Matrix A:" << endl;
// Den Operator << verwenden, um die Matrix auszugeben
// TODO: Matrix B ausgeben
// cout << "Matrix B:" << endl;
// Den Operator << verwenden, um die Matrix auszugeben
// TODO: A + B ausgeben
// cout << "A + B:" << endl;
// TODO: A - B ausgeben
// cout << "A - B:" << endl;
// TODO: Vergleichsergebnisse ausgeben
// cout << "A == B: " << (Ternär-Operator für true/false verwenden) << endl;
// cout << "A != B: " << (Ternär-Operator für true/false verwenden) << endl;
// TODO: Ergebnisse des Subskript-Zugriffs ausgeben
// cout << "A[0][0]: " << ... << endl;
// cout << "A[1][1]: " << ... << endl;
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische Container