Resumen: Calculadora de figuras
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy. Lección 63 de 104.
Desafío
FácilConstruyamos una calculadora de figuras que reúna todo lo que has aprendido sobre el polimorfismo. Crearás una clase abstracta Shape e implementarás figuras concretas que calculen su área y perímetro, todas accesibles mediante una interfaz común.
Organizarás tu código en cuatro archivos:
Shape.h: Define una clase abstractaShapeque sirve como modelo para todas las figuras. Tu clase base debe tener:- Un miembro protegido
std::string namepara identificar la figura - Un constructor que inicialice el nombre
- Métodos virtuales puros
area()yperimeter()que devuelvandouble - Un método
getName()que devuelva el nombre de la figura - Un destructor virtual
- Un miembro protegido
Circle.h: Implementa una claseCircleque herede deShape:- Un miembro privado
double radius - Un constructor que reciba el radio (establece el nombre como
"Circle") - Implementa
area()usando la fórmula: 3.14159 * radius * radius - Implementa
perimeter()usando: 2 * 3.14159 * radius
- Un miembro privado
Rectangle.h: Implementa una claseRectangleque herede deShape:- Miembros privados
double widthydouble height - Un constructor que reciba el ancho y la altura (establece el nombre como
"Rectangle") - Implementa
area()como width * height - Implementa
perimeter()como 2 * (width + height)
- Miembros privados
main.cpp: Lee cuatro entradas (cada una en una línea separada):- Radio del círculo (double)
- Ancho del rectángulo (double)
- Altura del rectángulo (double)
- Radio del segundo círculo (double)
Crea dinámicamente las tres figuras y almacénalas en un arreglo de punteros
Shape*. Recorre el arreglo y, para cada figura, imprime su información con este formato:<name>: Area: <area> Perimeter: <perimeter>Imprime una línea en blanco entre cada figura. Libera los objetos asignados dinámicamente cuando termines.
Por ejemplo, con las entradas 5, 4, 6 y 3:
Circle:
Area: 78.5397
Perimeter: 31.4159
Rectangle:
Area: 24
Perimeter: 20
Circle:
Area: 28.2743
Perimeter: 18.8495Observa cómo la misma lógica de printShapeInfo funciona para cualquier tipo de figura. Este es el poder del polimorfismo. Tu código procesa círculos y rectángulos de forma idéntica mediante la interfaz Shape, y cada figura sabe cómo calcular sus propias medidas. Usa la palabra clave override en todos los métodos sobrescritos para garantizar firmas de función correctas.
Pruébalo tú mismo
#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
using namespace std;
int main() {
// Leer entradas
double circleRadius1, rectWidth, rectHeight, circleRadius2;
cin >> circleRadius1;
cin >> rectWidth;
cin >> rectHeight;
cin >> circleRadius2;
// TODO: Crea un array de punteros Shape* con 3 elementos
// Shape* shapes[3];
// TODO: Crea las formas dinámicamente y almacénalas en el array
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: Recorre el array e imprime la información de cada forma
// Formato:
// <name>:
// Área: <area>
// Perímetro: <perimeter>
// (línea en blanco entre las formas, pero no después de la última)
// TODO: Liberar los objetos asignados dinámicamente
// delete shapes[i];
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosConstrucción y compilación en C++Archivos de cabecera y archivos fuenteNamespaces y alcanceIntroducción a OOP en C++Clases vs ObjetosEl puntero 'this'Métodos (Funciones miembro)Atributos (Miembros de datos)Conceptos básicos de Ctors y DtorsResumen - Calculadora simple4Propiedades de clase
Miembros de instancia vs. estáticosGetters y SettersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases amigasResumen - Gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de Ctor y DtorSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualResumen - Jerarquía de empleados2Gestión de memoria
Memoria Stack vs HeapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Resumen - Gestor de arrays dinámicos5Encapsulamiento
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultamiento de informaciónStruct vs ClassClases anidadas e internasResumen - Sistema de registros de estudiantes8Polimorfismo
Polimorfismo: Compilación vs. Tiempo de ejecuciónSobrecarga de funcionesFunciones virtuales revisadasFunciones virtuales purasClases abstractasDiseño de interfaces en C++Dynamic Casting y RTTIResumen: Calculadora de figuras11Conceptos avanzados de POO
Composición vs. HerenciaMixins mediante CRTPIdioma PimplBorrado de tiposEnum Classes y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño - Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y Destructores
Constructor por defectoConstructor parametrizadoConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis profundo del destructorRegla de tres / cinco / ceroResumen - Clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujo (Stream)Sobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tiposResumen - Clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasConceptos básicos de SFINAE y Type TraitsResumen - Contenedor genéricoPractica por tu cuenta: Compilador de C++ online