Ejercicios sobre conceptos avanzados de programación orientada a objetos
Ejercicio 1: Copia y movimiento de objetos
Diseña una clase RecursoAudio que simule la gestión de un recurso de audio en memoria (por ejemplo, un sonido cargado).
Cada objeto contendrá:
- un identificador de nombre,
- un recurso dinámico simulado (un entero gestionado con
std::unique_ptr<int>).
Implementa:
- Constructor que reciba un nombre y un valor inicial del recurso.
- Constructor de copia y operador de asignación por copia, que realicen una copia profunda (el nuevo objeto obtiene su propio recurso).
- Constructor de movimiento y operador de asignación por movimiento, que transfieran la propiedad del recurso mediante
std::move. - Un método
mostrar()que indique el nombre del objeto y el valor del recurso.
Finalmente, en main(), crea, copia y mueve objetos para observar qué operaciones se ejecutan.
Ejercicio 2: Control de creación, copia y movimiento
Diseña una clase ConexionBD que represente una conexión a una base de datos.
Por razones de seguridad y gestión de recursos:
- No debe poder copiarse (dos objetos no pueden compartir la misma conexión).
- Sí debe poder moverse (una conexión puede transferirse de un objeto a otro).
- Su creación debe estar controlada mediante una función estática o amiga.
-
La clase
ConexionBDdebe tener:- Un constructor privado que reciba el nombre de la base de datos.
- Un método público
conectar()que muestre un mensaje simulando la conexión. - Un método
cerrar()que indique el cierre de la conexión. - Un método
estaConectada()que devuelvatrueofalse. - Una función estática
crearConexion(const std::string&)que devuelva un objetoConexionBDválido.
-
Control del ciclo de vida:
- Prohíbe la copia con
= delete. - Permite el movimiento (
= defaulto implementación manual). - Muestra por consola mensajes cuando se construye, mueve o destruye el objeto.
- Prohíbe la copia con
Ejercicio 3: Clonación de objetos
Crea una jerarquía de clases clonables:
-
Una clase abstracta
Figuracon un método virtualclone(). -
Dos clases derivadas (
CirculoyRectangulo) que implementen la clonación profunda.Circulotendrá un atributoradiode tipodouble.Rectangulotendrá atributosanchoyaltode tipodouble.- Ambas clases tendrán un método
mostrar()que imprima los atributos y el área.
Permite duplicar objetos desde punteros a Figura sin conocer el tipo concreto.
Ejercicio 4: Sobrecarga de operadores
Crea una clase Tiempo que represente una cantidad de tiempo en horas y minutos.
Implementa la sobrecarga de operadores para:
+→ suma de dos tiempos-→ resta de dos tiempos==→ comparación de igualdad<<→ impresión en formatohh:mm
Ejercicio 5: Fluidez de métodos
Diseña una clase Pedido que permita construir y configurar un pedido en línea de forma fluida y legible.
Implementa los métodos:
setCliente(const std::string&)addProducto(const std::string&, double)aplicarDescuento(double)mostrarResumen()
El método mostrarResumen() debe cerrar el encadenamiento.
Ejemplo de uso:
pedido.setCliente("Ana")
.addProducto("Portátil", 1200.0)
.addProducto("Ratón", 25.0)
.aplicarDescuento(10.0)
.mostrarResumen();