Menu
Coddy logo textTech

Rückblick - Matrix-Klasse

Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 47 von 104.

challenge icon

Aufgabe

Einfach

Lassen 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 eine Matrix-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 und size_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() und getCols() (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 die matrix[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 false zurückgeben, wenn sich die Dimensionen unterscheiden.

  • main.cpp: Lesen Sie die Eingabe ein, um zwei 2x2-Matrizen zu erstellen und zu manipulieren. Das Eingabeformat ist:
    1. Vier Ganzzahlen für die erste Matrix (zeilenweise): a00, a01, a10, a11
    2. 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 der set()-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 true oder false (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]: 4

Verwenden 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