Menu
Coddy logo textTech

Wiederholung – Matrix-Klasse

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

challenge icon

Aufgabe

Einfach

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

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

Verwende 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

Übe selbstständig: Online-C++-Compiler