Wiederholung – Matrix-Klasse
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 47 von 104.
Aufgabe
EinfachErstellen wir eine Matrix-Klasse, die alle Techniken zur Operatorüberladung zusammenführt, die du in diesem Kapitel gelernt hast. Du erstellst eine voll ausgestattete Matrix, die arithmetische Operationen, Vergleiche, Elementzugriff und Stream-Ausgabe unterstützt – alles über eine intuitive Operatorsyntax.
Du organisierst deinen Code über zwei Dateien:
Matrix.h: Definiere eineMatrix-Klasse, die mithilfe von dynamischem Speicher ein 2D-Array von Ganzzahlen verwaltet. Deine Matrix sollte Folgendes unterstützen:- Private Member: einen
int**-Zeiger für die 2D-Daten sowiesize_t-Member für Zeilen und Spalten - Einen Konstruktor, der Zeilen und Spalten entgegennimmt und alle Elemente mit 0 initialisiert
- Einen Destruktor, der den gesamten reservierten Speicher ordnungsgemäß freigibt
- Einen Kopierkonstruktor und einen Kopierzuweisungsoperator (tiefe Kopie mit Prüfung auf Selbstzuweisung)
- Getter
getRows()undgetCols()(beide const) - Eine
set(row, col, value)-Methode zum Setzen einzelner Elemente - Eine const-Methode
get(row, col)zum Auslesen von Elementen
Implementiere diese Operatoren:
- Arithmetik:
+und-für die Addition und Subtraktion von Matrizen (geben eine neue Matrix als Wert zurück) - Vergleich:
==und!=, um zu prüfen, ob zwei Matrizen dieselben Dimensionen und identische Elemente haben - Stream:
<<als friend-Funktion, um die Matrix Zeile für Zeile auszugeben, wobei die Elemente durch Leerzeichen getrennt werden und jede Zeile in einer neuen Zeile steht - Indexoperator:
[], der einen Zeiger auf eine Zeile zurückgibt und dadurch die Syntaxmatrix[row][col]ermöglicht (stelle sowohl const- als auch nicht-const-Versionen bereit)
Gehe bei arithmetischen Operatoren davon aus, dass beide Matrizen dieselben Dimensionen haben. Vergleichsoperatoren sollten
falsezurückgeben, wenn sich die Dimensionen unterscheiden.- Private Member: einen
main.cpp: Lies Eingaben ein, um zwei 2x2-Matrizen zu erstellen und zu bearbeiten. Das Eingabeformat lautet:- Vier Ganzzahlen für die erste Matrix (Zeile für Zeile): a00, a01, a10, a11
- Vier Ganzzahlen für die zweite Matrix (Zeile für Zeile): b00, b01, b10, b11
Erstelle zwei
Matrix-Objekte (jeweils 2 Zeilen und 2 Spalten), fülle sie mithilfe derset()-Methode und demonstriere anschließend deine 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 Elemente anzeigen, die durch einzelne Leerzeichen getrennt sind. Gib für Vergleichsergebnisse
trueoderfalse(kleingeschrieben) aus.
Beispielsweise 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]: 4Verwende std::stoi() für die Eingabekonvertierung. Denke daran, != anhand von == zu implementieren, damit deine Operatoren konsistent bleiben. Vergiss die Header-Guards in deiner Header-Datei nicht.
Probier es selbst
#include <iostream>
#include <string>
#include "Matrix.h"
using namespace std;
int main() {
// Eingabe für erste Matrix (2x2) lesen: a00, a01, a10, a11
int a00, a01, a10, a11;
cin >> a00 >> a01 >> a10 >> a11;
// Eingabe für 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 set()-Methode 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äroperator für true/false verwenden) << endl;
// cout << "A != B: " << (Ternäroperator für true/false verwenden) << endl;
// TODO: Ergebnisse des Subskriptzugriffs 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 & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler