Métodos auxiliares
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 10 de 61.
Até agora, vimos funções que modificam os dados de uma struct (como player_take_damage) e funções que simplesmente os exibem. Mas há outra categoria importante: funções que calculam valores derivados dos membros de uma struct sem alterar nada.
Considere uma estrutura Rectangle que armazena a largura e a altura. A área não é armazenada: ela é calculada quando necessário:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
Esses são métodos auxiliares. Eles usam os dados existentes da struct e produzem um novo valor. Observe que eles usam ponteiros const, pois apenas leem, nunca escrevem. O resultado calculado é retornado, em vez de ser armazenado na struct.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Esse padrão mantém suas structs enxutas: armazene apenas os dados essenciais e calcule todo o resto quando necessário. Ele também garante que os valores derivados sejam sempre consistentes com o estado atual.
Desafio
FácilVamos criar um módulo Circle que calcula valores derivados a partir dos dados armazenados. Você vai praticar a escrita de métodos auxiliares: funções que calculam resultados com base nos membros de uma struct sem modificá-los.
Você criará três arquivos:
circle.h: Declare uma structCirclecom um único membrodouble radius. Declare também dois métodos auxiliares:circle_area: recebe um ponteiroconstpara Circle e retorna a áreacircle_circumference: recebe um ponteiroconstpara Circle e retorna a circunferência
CIRCLE_H.circle.c: Implemente os dois métodos auxiliares. Para os cálculos, use3.14159como valor de pi. A fórmula da área épi * radius * radius, e a fórmula da circunferência é2 * pi * radius. Ambas as funções devem apenas ler o raio: nunca o modifique.main.c: Crie um Circle e use os métodos auxiliares para calcular e exibir suas propriedades.
Você receberá uma entrada: o raio do círculo (como um double).
No seu arquivo principal, inicialize um Circle com o raio fornecido e, em seguida, use seus métodos auxiliares para calcular e imprimir a área e a circunferência.
Imprima os resultados neste formato:
Area: {area}
Circumference: {circumference}Use %.2f para ambos os valores, a fim de exibir duas casas decimais.
Por exemplo, para um raio de 5.0, a saída seria:
Area: 78.54
Circumference: 31.42Experimente você mesmo
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Crie uma struct Circle com o raio fornecido
// TODO: Use as funções auxiliares circle_area e circle_circumference
// para calcular e imprimir os resultados
// Formato de impressão:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online