Recapitulação: String Wrapper
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 16 de 61.
Desafio
FácilVamos construir um módulo StringObject que envolve um array de caracteres alocado dinamicamente. Este desafio de recapitulação reúne o ciclo de vida completo do objeto—construtor, método de apenas leitura e destrutor—todos trabalhando juntos para gerenciar a memória com segurança.
Você criará três arquivos:
stringobj.h: Declare uma structStringObjectcom um único membro:char *text(um ponteiro para uma string alocada dinamicamente). Também declare três funções:create_string— recebe umconst char *de entrada e retorna um ponteiro para um StringObject recém-alocadoprint_string— recebe umconst StringObject *e exibe o texto armazenadofree_string— recebe umStringObject *e libera toda a memória alocada
STRINGOBJ_H.stringobj.c: Implemente todas as três funções. Seu construtor deve alocar memória para a struct, depois alocar memória para o texto (lembre-se dostrlenmais um para o terminador nulo) e copiar a string de entrada. Seu destrutor deve liberar na ordem inversa—o buffer internotextprimeiro, depois a própria struct. Inclua uma verificação de NULL em seu destrutor por segurança.main.c: Use seu módulo para criar um objeto de string, exibir seu conteúdo e, em seguida, fazer a limpeza adequada.
Você receberá uma entrada: uma string de texto para armazenar em seu StringObject.
Em seu arquivo principal, crie um StringObject com o texto fornecido, imprima seu conteúdo, libere a memória e, em seguida, imprima uma mensagem de confirmação.
A função print_string deve produzir a saída neste formato:
Text: {text}Após a liberação, imprima:
FreedPor exemplo, com a entrada Hello World, a saída seria:
Text: Hello World
FreedExperimente você mesmo
#include <stdio.h>
#include "stringobj.h"
int main() {
char input[256];
fgets(input, sizeof(input), stdin);
// Remove a quebra de linha se estiver presente
int len = 0;
while (input[len] != '\0') len++;
if (len > 0 && input[len - 1] == '\n') {
input[len - 1] = '\0';
}
// TODO: Crie um StringObject com o texto de entrada
// TODO: Imprima a string usando print_string
// TODO: Libere o StringObject usando free_string
// TODO: Imprima "Freed" para confirmar a limpeza
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