Implementação do Retângulo
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 46 de 61.
Desafio
FácilVamos continuar construindo o projeto Shape Drawer implementando o Rectangle — outra forma concreta que incorpora a struct base Shape, assim como fizemos com o Circle.
Com base no seu projeto existente, você adicionará a funcionalidade de retângulo nestes arquivos:
shape.h: Mantenha sua interface baseShapecom os tipos de ponteiro de funçãoDrawFunceAreaFuncdas lições anteriores.circle.hecircle.c: Mantenha sua implementação de Circle da lição anterior.rectangle.h: Defina sua structRectangleaqui. Um retângulo incorporaShapecomo seu primeiro membro e adiciona os camposwidtheheight(ambosdouble). Declare uma função construtoracreate_rectangleque recebe os parâmetros width e height e retorna umRectanglepor valor.rectangle.c: Implemente o comportamento específico do retângulo:draw_rectangle— imprimeDrawing Rectangle with width: X.XX and height: X.XX(ambos os valores exibidos com 2 casas decimais)area_rectangle— retorna width × heightcreate_rectangle— inicializa umRectangle, conecta os ponteiros de função doShapeincorporado às funções do retângulo, define as dimensões e retorna o retângulo
main.c: Demonstre ambas as formas funcionando através da mesma interface. Leia duas entradas: largura (width) e altura (height) para um retângulo. Crie um retângulo usando seu construtor e, em seguida, chame tantodrawquantoareaatravés dos ponteiros de função doShapeincorporado. Imprima a área com 2 casas decimais.
Seu programa receberá duas entradas: valores de width e height (como números de ponto flutuante).
Exemplo de saída quando as entradas são 4.0 e 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00Exemplo de saída quando as entradas são 7.5 e 2.5:
Drawing Rectangle with width: 7.50 and height: 2.50
Area: 18.75Assim como no Circle, o Rectangle incorpora o Shape como seu primeiro membro, permitindo que você acesse os ponteiros de função através do membro incorporado. Esse padrão consistente é o que permite o polimorfismo — ambas as formas podem ser tratadas uniformemente através de sua interface Shape. Lembre-se de usar include guards em todos os arquivos de cabeçalho.
Experimente você mesmo
#include <stdio.h>
#include "shape.h"
#include "rectangle.h"
int main() {
double width, height;
scanf("%lf", &width);
scanf("%lf", &height);
// TODO: Criar um retângulo usando create_rectangle(width, height)
// TODO: Chamar draw através do ponteiro de função da Shape incorporada
// TODO: Chamar area através do ponteiro de função da Shape incorporada
// TODO: Imprimir a área com 2 casas decimais: "Area: %.2f\n"
return 0;
}Todas as lições de Object Oriented Programming
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do Círculo