Menu
CoddyTech

Repaso: clase String

Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy. Lección 26 de 104.

challenge icon

Desafío

Fácil

Vamos a crear una clase String completa que gestione su propio arreglo dinámico de caracteres y reúna todos los conceptos de constructores y destructores de este capítulo. Este es un ejercicio clásico que refleja cómo funciona internamente std::string.

Crearás dos archivos para organizar tu código:

  • String.h: Define tu clase String siguiendo la Regla de Cinco. Tu clase debe gestionar un puntero char* llamado data y un miembro size_t length. Implementa:
    • Un constructor predeterminado que cree una cadena vacía (asigna memoria para un solo carácter, el terminador nulo, y establece la longitud en 0). Imprime "Default constructed"
    • Un constructor parametrizado que reciba un const char* y copie la cadena C en memoria recién asignada. Imprime "Constructed: <text>"
    • Un constructor de copia que realice una copia profunda de otra String. Imprime "Copied: <text>"
    • Un constructor de movimiento (marcado como noexcept) que transfiera la propiedad. Imprime "Moved: <text>" usando el texto antes de anular el origen
    • Un destructor que libere la memoria de forma segura (comprueba si es null). Imprime "Destroyed: <text>" (imprime "Destroyed: (empty)" si data es null o length es 0)
    • Un método size() que devuelva la longitud
    • Un método c_str() que devuelva el puntero a los caracteres (devuelve "" si es null)
  • main.cpp: Muestra cómo funcionan juntos todos los constructores. Lee una cadena de texto de la entrada y luego:
    • Crea un String llamado s1 usando el constructor predeterminado
    • Crea un String llamado s2 con el texto de entrada
    • Crea un String llamado s3 copiando s2
    • Crea un String llamado s4 moviendo el contenido de s2
    • Imprime "--- Status ---"
    • Para cada cadena (de s1 a s4), imprime "s<n>: \"<text>\" (length: <len>)"

Usa listas de inicialización en todos los constructores para mejorar la eficiencia. Después del movimiento, s2 debe estar vacía y tener una longitud de 0, mientras que s4 debe contener el texto original. Los mensajes del destructor al final mostrarán que los cuatro objetos se liberan en orden inverso al de su creación.

Incluye <cstring> para strlen y strcpy, y <utility> para std::move(). No olvides las protecciones de inclusión en tu archivo de encabezado.

Pruébalo tú mismo

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

using namespace std;

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

    // TODO: Crea String s1 usando el constructor predeterminado

    // TODO: Crea String s2 con el texto de entrada

    // TODO: Crea String s3 copiando s2

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

    // Imprime la cabecera de estado
    cout << "--- Status ---" << endl;

    // TODO: Imprime el estado de cada cadena desde s1 hasta s4
    // Formato: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C++ online