Menu
Coddy logo textTech

Ripasso - classe String

Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 26 di 104.

challenge icon

Sfida

Facile

Costruiamo una classe String completa che gestisca il proprio array dinamico di caratteri, riunendo tutti i concetti relativi a costruttori e distruttori di questo capitolo. È un esercizio classico che riproduce il funzionamento interno di std::string.

Creerai due file per organizzare il codice:

  • String.h: definisci la classe String seguendo la Rule of Five. La classe deve gestire un puntatore char* chiamato data e un membro size_t length. Implementa:
    • Un costruttore predefinito che crea una stringa vuota (alloca un singolo carattere per il terminatore nullo e imposta la lunghezza a 0). Stampa "Default constructed"
    • Un costruttore con parametri che accetta un const char* e copia la stringa C in memoria appena allocata. Stampa "Constructed: <text>"
    • Un costruttore di copia che esegue una copia profonda di un'altra String. Stampa "Copied: <text>"
    • Un costruttore di spostamento (contrassegnato con noexcept) che trasferisce la proprietà. Stampa "Moved: <text>" usando il testo prima di azzerare la sorgente
    • Un distruttore che libera la memoria in modo sicuro (controlla che non sia null). Stampa "Destroyed: <text>" (stampa "Destroyed: (empty)" se data è null o la lunghezza è 0)
    • Un metodo size() che restituisce la lunghezza
    • Un metodo c_str() che restituisce il puntatore ai caratteri (restituisce "" se è null)
  • main.cpp: mostra il funzionamento congiunto di tutti i costruttori. Leggi una stringa di testo dall'input, poi:
    • Crea una String chiamata s1 usando il costruttore predefinito
    • Crea una String chiamata s2 con il testo inserito
    • Crea una String chiamata s3 copiando s2
    • Crea una String chiamata s4 spostando s2
    • Stampa "--- Status ---"
    • Per ogni stringa (da s1 a s4), stampa "s<n>: \"<text>\" (length: <len>)"

Usa liste di inizializzazione in tutti i costruttori per maggiore efficienza. Dopo lo spostamento, s2 dovrebbe essere vuota e avere lunghezza 0, mentre s4 conterrà il testo originale. I messaggi del distruttore alla fine mostreranno la pulizia di tutti e quattro gli oggetti in ordine inverso rispetto alla loro creazione.

Includi <cstring> per strlen e strcpy e <utility> per std::move(). Non dimenticare le protezioni dell'header nel file header.

Provalo tu

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

using namespace std;

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

    // TODO: Crea String s1 usando il costruttore predefinito

    // TODO: Crea String s2 con il testo di input

    // TODO: Crea String s3 copiando s2

    // TODO: Crea String s4 spostando da s2 (usa std::move)

    // Stampa l'intestazione dello stato
    cout << "--- Status ---" << endl;

    // TODO: Stampa lo stato di ogni stringa da s1 a s4
    // Formato: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C++ online