Menu
Coddy logo textTech

Zusammenfassung - String-Klasse

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

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine vollständige String-Klasse erstellen, die ihr eigenes dynamisches Zeichen-Array verwaltet und dabei alle Konstruktor- und Destruktor-Konzepte aus diesem Kapitel zusammenführt. Dies ist eine klassische Übung, die widerspiegelt, wie std::string intern funktioniert.

Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:

  • String.h: Definieren Sie Ihre String-Klasse gemäß der Rule of Five. Ihre Klasse sollte einen char*-Pointer namens data und ein size_t length-Mitglied verwalten. Implementieren Sie:
    • Einen Standardkonstruktor, der einen leeren String erstellt (reservieren Sie ein einzelnes Zeichen für den Null-Terminator, setzen Sie die Länge auf 0). Geben Sie "Default constructed" aus.
    • Einen parametrisierten Konstruktor, der einen const char* entgegennimmt und den C-String in neu reservierten Speicher kopiert. Geben Sie "Constructed: <text>" aus.
    • Einen Kopierkonstruktor, der eine tiefe Kopie eines anderen Strings durchführt. Geben Sie "Copied: <text>" aus.
    • Einen Move-Konstruktor (gekennzeichnet mit noexcept), der den Besitz überträgt. Geben Sie "Moved: <text>" aus, wobei der Text verwendet wird, bevor die Quelle auf null gesetzt wird.
    • Einen Destruktor, der den Speicher sicher freigibt (auf null prüfen). Geben Sie "Destroyed: <text>" aus (geben Sie "Destroyed: (empty)" aus, wenn data null oder die Länge 0 ist).
    • Eine size()-Methode, die die Länge zurückgibt.
    • Eine c_str()-Methode, die den Zeichen-Pointer zurückgibt (geben Sie "" zurück, falls null).
  • main.cpp: Demonstrieren Sie das Zusammenwirken aller Konstruktoren. Lesen Sie einen Text-String von der Eingabe ein und führen Sie dann Folgendes aus:
    • Erstellen Sie einen String namens s1 mit dem Standardkonstruktor.
    • Erstellen Sie einen String namens s2 mit dem eingegebenen Text.
    • Erstellen Sie einen String namens s3 durch Kopieren von s2.
    • Erstellen Sie einen String namens s4 durch Verschieben (Move) von s2.
    • Geben Sie "--- Status ---" aus.
    • Geben Sie für jeden String (s1 bis s4) "s<n>: \"<text>\" (length: <len>)" aus.

Verwenden Sie in allen Konstruktoren Initialisierungslisten für mehr Effizienz. Nach dem Move sollte s2 leer sein mit der Länge 0, während s4 den ursprünglichen Text enthält. Die Destruktor-Meldungen am Ende zeigen, wie alle vier Objekte in umgekehrter Reihenfolge ihrer Erstellung bereinigt werden.

Binden Sie <cstring> für strlen und strcpy sowie <utility> für std::move() ein. Vergessen Sie nicht die Header-Guards in Ihrer Header-Datei.

Probier es selbst

#include <iostream>
#include <string>
#include "String.h"

using namespace std;

int main() {
    string input;
    getline(cin, input);

    // TODO: Erstelle String s1 mit dem Standardkonstruktor

    // TODO: Erstelle String s2 mit dem eingegebenen Text

    // TODO: Erstelle String s3 durch Kopieren von s2

    // TODO: Erstelle String s4 durch Verschieben von s2 (verwende std::move)

    // Status-Header ausgeben
    cout << "--- Status ---" << endl;

    // TODO: Status für jeden String von s1 bis s4 ausgeben
    // Format: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

Alle Lektionen in Objektorientierte Programmierung