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 criar 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 seu perímetro, todas acessíveis por meio de uma interface comum.
Você organizará seu código em quatro arquivos:
Shape.h: Defina uma classe abstrataShapeque sirva como modelo para todas as formas. Sua classe-base deve ter:- Um membro protegido
std::string namepara identificar a forma - Um construtor que inicialize o nome
- Métodos virtuais puros
area()eperimeter()que retornemdouble - Um método
getName()que retorne o nome da forma - Um destrutor virtual
- Um membro protegido
Circle.h: Implemente uma classeCircleque herde deShape:- Um membro privado
double radius - Um construtor que receba 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 herde deShape:- Membros privados
double widthedouble height - Um construtor que receba width e height (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 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. Libere os objetos alocados dinamicamente ao 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. Esse é o poder do polimorfismo. Seu código processa círculos e retângulos de forma idêntica por meio 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: Crie um array de ponteiros Shape* com 3 elementos
// Shape* shapes[3];
// TODO: Crie as formas dinamicamente e armazene no array
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: Percorra o array e imprima as informações de cada forma
// Formato:
// <name>:
// Área: <area>
// Perímetro: <perimeter>
// (linha em branco entre as formas, mas não após a última)
// TODO: Limpe os objetos alocados dinamicamente
// delete shapes[i];
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online