Métodos Auxiliares
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 10 de 61.
Até agora, vimos funções que modificam dados de struct (como player_take_damage) e funções que simplesmente os exibem. Mas há outra categoria importante: funções que computam valores derivados a partir de membros da struct sem alterar nada.
Considere uma struct Rectangle que armazena largura e altura. A área não é armazenada — ela é calculada sob demanda:
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);
}
Estes são métodos auxiliares—eles pegam os dados existentes da struct e produzem um novo valor. Observe que eles usam ponteiros const, já que eles apenas leem, nunca escrevem. O resultado computado é 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
Este 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 estejam sempre consistentes com o estado atual.
Desafio
FácilVamos construir um módulo Circle que calcula valores derivados de dados armazenados. Você praticará a escrita de métodos auxiliares — funções que computam resultados a partir de membros de uma struct sem modificá-los.
Você criará três arquivos:
circle.h: Declare uma structCirclecom um único membrodouble radius. Também declare 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 ambos os métodos auxiliares. Para os cálculos, use3.14159como o 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 modificá-lo.main.c: Crie um Circle e use os métodos auxiliares para computar e exibir suas propriedades.
Você receberá uma entrada: o radius do círculo (como um double).
No seu arquivo principal, inicialize um Circle com o raio fornecido, então 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 para exibir duas casas decimais.
Por exemplo, com um raio de 5.0, a saída seria:
Area: 78.54
Circumference: 31.42Folha de consulta
As funções podem calcular valores derivados de membros de uma struct sem modificar a struct. Estes são chamados de métodos auxiliares (helper methods).
Os métodos auxiliares usam ponteiros const, pois eles apenas leem dados, nunca escrevem:
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);
}
Usando métodos auxiliares:
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Este padrão mantém as structs enxutas, armazenando apenas dados essenciais e calculando valores derivados sob demanda, garantindo a consistência com o estado atual.
Experimente você mesmo
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Crie uma struct Circle com o radius fornecido
// TODO: Use os métodos 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 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