Structs como objetos
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 6 de 61.
Em linguagens orientadas a objetos, um objeto é uma entidade que reúne dados (estado) com funções que operam sobre esses dados (métodos). C não tem objetos integrados, mas podemos alcançar o mesmo conceito usando structs e funções.
Pense em uma struct como a parte de “dados” de um objeto. Ela contém o estado: os valores que definem o que o objeto é no momento:
typedef struct {
int value;
} Counter;
Essa struct Counter representa uma entidade com um único estado: seu valor atual. Para dar comportamento a ela, escrevemos funções que aceitam a struct como parâmetro:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Essas funções agem como métodos. Elas operam especificamente sobre dados de Counter. Ao passar a estrutura para as funções, estamos simulando o que outras linguagens fazem automaticamente quando você chama counter.increment().
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Imprime: 1
return 0;
}
A convenção de nomenclatura typename_action (como counter_increment) ajuda a organizar seu código e deixa claro a qual struct uma função pertence. Esse padrão é a base da programação orientada a objetos em C.
Desafio
FácilVamos criar um módulo simples Counter que trata uma struct como um objeto com comportamento. Você organizará seu código em três arquivos para praticar o padrão de agrupar dados com funções que operam sobre eles.
Você criará três arquivos:
counter.h: Seu arquivo de cabeçalho que declara a structCountercom um único membroint value. Declare também duas funções que atuam como “métodos” do contador:counter_increment(recebe um ponteiro para Counter e aumenta seu valor em 1) ecounter_get(recebe um ponteiro para Counter e retorna seu valor atual). Use guardas de inclusão com o símboloCOUNTER_H.counter.c: Seu arquivo-fonte que implementa as duas funções. Lembre-se de incluir seu arquivo de cabeçalho.main.c: Seu arquivo principal, que cria um Counter, realiza operações nele e exibe os resultados.
Você receberá duas entradas inteiras: o valor inicial do seu contador e o número de vezes que ele deve ser incrementado.
No seu arquivo principal, inicialize um Counter com o valor inicial e, em seguida, chame counter_increment o número de vezes especificado. Por fim, use counter_get para obter e imprimir o valor final.
Imprima o resultado neste formato:
Final value: {result}Por exemplo, com um valor inicial de 5 e 3 incrementos, a saída seria:
Final value: 8Experimente você mesmo
#include <stdio.h>
#include "counter.h"
int main() {
// Leia a entrada
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: Crie um Counter e inicialize-o com starting_value
// TODO: Chame counter_increment o número de vezes especificado
// TODO: Use counter_get para obter o valor final e imprimi-lo
// Formato de impressão: "Final value: {result}"
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