Métodos

42 (XII): C++, los módulos

De C a C++: clases, herencia, polimorfismo y overload. El cambio de mentalidad

2 min de lectura

42 (XIII): C++, los módulos

Después de un año de C estricta, donde nada te lo dan hecho y cada byte lo gestionas tú, la primera semana de C++ fue un choque extraño: std::cout (la manera de C++ de escribir en pantalla), std::string (cadenas de texto que se gestionan solas), clases que se inicializan solas. Tuve la sensación de hacer trampa. Dos horas después, el compilador ya se había encargado de deshacerme la ilusión.

El problema

El currículum de C++ en 42 llega en diez módulos, cpp00 a cpp09, en el tramo final del tronco común —la parada anterior había sido NetPractice, redes sin servidor—, y no es un curso de sintaxis: es un cambio de mentalidad. En C piensas en funciones y en memoria; en C++ diseñas tipos. Y 42, como siempre, pone reglas que te fuerzan a entender el porqué: nada de printf, nada de malloc, nada de los casts viejos. Si hacías servir C++, tenía que ser C++ de verdad: streams, referencias, y una forma canónica ortodoxa que toda clase debe cumplir —constructor por defecto, constructor de copia, operador de asignación y destructor— para poder copiarse y destruirse sin sorpresas.

Cómo lo abordé

Módulo a módulo, con el Makefile (el archivo que dice cómo se compila todo) como compañero de viaje. El 00 fueron clases y la forma canónica. El 01, reserva con new (la manera de C++ de pedir memoria) y la diferencia real entre punteros y referencias. El 02, sobrecarga de operadores: hacer que una clase se pueda sumar, comparar e incrementar como si fuera un número. El 03, herencia, con la trampa de siempre: qué se hereda y qué no. Y el 04, el que lo ata todo: polimorfismo por subtipado, clases abstractas, y la regla que más me ha marcado —el destructor debe ser virtual, porque si borras un objeto derivado a través de su padre, sin virtual no se libera todo. En el repositorio mis módulos llegan hasta aquí; los últimos, de plantillas y contenedores, los trabajé con material de referencia al lado. No me pesa: buena parte de estos temas vuelve, comprimida, en el examen de nivel 5 superado.

Qué aprendí

Que el C del año anterior no fue un lastre: se sabe qué hace un std::string por dentro cuando has escrito tú el gestor de memoria. Que las referencias no son punteros con modales: son alias con restricciones, y esas restricciones son lo que les da valor. Que heredar es fácil, pero el polimorfismo —una interfaz común que se comporta según el tipo real— es todo el punto del diseño orientado a objetos. Y que ahora un mensaje de error del compilador de C++ de tres líneas me sabe bien: me dice que el tipo me está protegiendo de un bug que en C habría salido a las tres de la madrugada.