Inicialização da pilha
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 14 de 61.
Nem todo objeto precisa ficar no heap. Quando uma struct é pequena e tem vida útil curta, alocá-la na pilha é mais simples e rápido: sem malloc, sem free, sem risco de vazamentos de memória.
Em vez de retornar um ponteiro, uma função fábrica pode retornar a struct por valor. A struct inteira é copiada para quem a chamou:
typedef struct {
int x;
int y;
} Point;
Point create_point(int x, int y) {
Point p;
p.x = x;
p.y = y;
return p;
}
O chamador recebe uma cópia totalmente inicializada:
Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);
Sem ponteiros, sem necessidade de limpeza. Quando origin e cursor saem do escopo, eles são destruídos automaticamente.
Essa abordagem funciona melhor para structs pequenas, sem membros alocados dinamicamente. Para objetos maiores ou que contenham ponteiros para a memória heap, o padrão de construtor com malloc continua sendo a melhor opção.
Desafio
FácilVamos criar um módulo Temperature que cria leituras de temperatura na pilha usando uma função de fábrica. Ao contrário dos construtores baseados em heap das lições anteriores, essa abordagem retorna a struct por valor: sem malloc, sem free, apenas uma alocação simples e eficiente na pilha.
Você criará três arquivos:
temperature.h: Declare uma structTemperaturecom dois membros:double celsiusechar scale(para armazenar 'C' para Celsius). Declare também duas funções:create_temperature: recebe um valor double e retorna uma structTemperaturepor valor (não um ponteiro!)temperature_to_fahrenheit: recebe umconst Temperature *e retorna a temperatura equivalente em Fahrenheit como um double
TEMPERATURE_H.temperature.c: Implemente as duas funções. Sua função de fábrica deve criar uma variável localTemperature, inicializar seus campos (definirscalecomo'C') e retorná-la. A fórmula de conversão é:fahrenheit = celsius * 9.0 / 5.0 + 32.0main.c: Use sua função de fábrica para criar uma leitura de temperatura e exibir os valores em Celsius e Fahrenheit.
Você receberá uma entrada: a temperatura em Celsius (como um double).
No seu arquivo principal, use create_temperature para criar uma struct Temperature com o valor informado. Em seguida, imprima o valor original em Celsius e seu equivalente em Fahrenheit.
Imprima a saída neste formato:
Celsius: {celsius}
Fahrenheit: {fahrenheit}Use %.2f para ambos os valores, a fim de exibir duas casas decimais.
Por exemplo, com uma entrada de 25.0, a saída seria:
Celsius: 25.00
Fahrenheit: 77.00Observe como essa abordagem é simples. Você recebe uma struct totalmente inicializada sem preocupações com gerenciamento de memória. Quando sua variável Temperature sai do escopo, ela é limpa automaticamente.
Experimente você mesmo
#include <stdio.h>
#include "temperature.h"
int main() {
double celsius_input;
scanf("%lf", &celsius_input);
// TODO: Use create_temperature para criar uma struct Temperature
// TODO: Imprima o valor em Celsius usando o formato %.2f
// TODO: Use temperature_to_fahrenheit para converter e imprimir o valor em Fahrenheit
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