Recapitulação - Calculadora de Formas
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 63 de 104.
Desafio
FácilVamos construir uma calculadora de formas que reúne tudo o que você aprendeu sobre polimorfismo. Você criará uma classe abstrata Shape e implementará formas concretas que calculam sua área e perímetro, todas acessíveis através de uma interface comum.
Você organizará seu código em quatro arquivos:
Shape.h: Defina uma classe abstrataShapeque serve como modelo para todas as formas. Sua classe base deve ter:- Um membro protegido
std::string namepara identificar a forma - Um construtor que inicializa o nome
- Métodos virtuais puros
area()eperimeter()que retornamdouble - Um método
getName()que retorna o nome da forma - Um destrutor virtual
- Um membro protegido
Circle.h: Implemente uma classeCircleque herda deShape:- Um membro privado
double radius - Um construtor que recebe o raio (defina o nome como
"Circle") - Implemente
area()usando a fórmula: 3.14159 * radius * radius - Implemente
perimeter()usando: 2 * 3.14159 * radius
- Um membro privado
Rectangle.h: Implemente uma classeRectangleque herda deShape:- Membros privados
double widthedouble height - Um construtor que recebe largura e altura (defina o nome como
"Rectangle") - Implemente
area()como width * height - Implemente
perimeter()como 2 * (width + height)
- Membros privados
main.cpp: Leia quatro entradas (cada uma em uma linha separada):- Raio do círculo (double)
- Largura do retângulo (double)
- Altura do retângulo (double)
- Raio do segundo círculo (double)
Crie todas as três formas dinamicamente e armazene-as em um array de ponteiros
Shape*. Percorra o array e, para cada forma, imprima suas informações neste formato:<name>: Area: <area> Perimeter: <perimeter>Imprima uma linha em branco entre cada forma. Limpe seus objetos alocados dinamicamente quando terminar.
Por exemplo, com as entradas 5, 4, 6, e 3:
Circle:
Area: 78.5397
Perimeter: 31.4159
Rectangle:
Area: 24
Perimeter: 20
Circle:
Area: 28.2743
Perimeter: 18.8495Observe como a mesma lógica de printShapeInfo funciona para qualquer tipo de forma — este é o poder do polimorfismo. Seu código processa círculos e retângulos de forma idêntica através da interface Shape, e cada forma sabe como calcular suas próprias medidas. Use a palavra-chave override em todos os métodos sobrescritos para garantir assinaturas de função corretas.
Experimente você mesmo
#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
using namespace std;
int main() {
// Ler entradas
double circleRadius1, rectWidth, rectHeight, circleRadius2;
cin >> circleRadius1;
cin >> rectWidth;
cin >> rectHeight;
cin >> circleRadius2;
// TODO: Criar um array de ponteiros Shape* com 3 elementos
// Shape* shapes[3];
// TODO: Criar formas dinamicamente e armazenar no array
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: Percorrer o array e imprimir as informações de cada forma
// Formato:
// <name>:
// Area: <area>
// Perimeter: <perimeter>
// (linha em branco entre as formas, mas não após a última)
// TODO: Limpar os objetos alocados dinamicamente
// delete shapes[i];
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos ExternosBuild e Compilação em C++Arquivos Header e SourceNamespaces e EscopoIntrodução a OOP em C++Classes vs ObjetosO Ponteiro 'this'Métodos (Funções Membro)Atributos (Membros de Dados)Básico de Ctors e DtorsRecapitulação - Calculadora Simples4Propriedades de Classe
Membros de Instância vs EstáticosGetters e SettersFunções de Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRecapitulação - Gerenciador de Conta Bancária7Herança
Herança BásicaNíveis de Acesso na HerançaOrdem de Chamada de Ctor e DtorSobrescrita de MétodosFunções Virtuais e VTableHerança MúltiplaHerança VirtualRecapitulação - Hierarquia de Funcionários2Gerenciamento de Memória
Memória Stack vs HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Smart Pointers em C++RAII em C++Recapitulação - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de Acesso em C++Especificadores de Acesso em DetalhesOcultação de InformaçãoStruct vs ClassClasses Aninhadas e InternasRecapitulação - Sistema de Registros de Alunos8Polimorfismo
Polimorfismo de Compilação vs Tempo de ExecuçãoSobrecarga de FunçõesFunções Virtuais RevisitadasFunções Virtuais PurasClasses AbstratasDesign de Interfaces em C++Dynamic Casting e RTTIRecapitulação - Calculadora de Formas3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentaçãoListas de Inicialização do ConstrutorConstrutores DelegadosMergulho Profundo em DestrutoresRegra dos Três / Cinco / ZeroRecapitulação - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de StreamSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçãoTemplates de ClasseEspecialização de TemplatesTemplates VariádicosFundamentos de SFINAE e Type TraitsRecapitulação - Container Genérico