Structs como Objetos
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 6 de 61.
Em linguagens orientadas a objetos, um objeto é uma entidade que agrupa dados (estado) com funções que operam sobre esses dados (métodos). C não possui objetos nativos, 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 mantém o estado — os valores que definem o que o objeto é atualmente:
typedef struct {
int value;
} Counter;
Esta struct Counter representa uma entidade com uma única parte de estado: seu valor atual. Para dar a ela comportamento, escrevemos funções que aceitam a struct como um 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 do Counter. Ao passar a struct 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 torna claro a qual struct uma função pertence. Este padrão é a base da programação orientada a objetos em C.
Desafio
FácilVamos construir um módulo Counter simples 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 declarando a structCountercom um único membroint value. Também declare duas funções que atuam como "métodos" para o 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 include guards com o símboloCOUNTER_H.counter.c: Seu arquivo de origem implementando ambas as 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 para o seu contador e o número de vezes para incrementá-lo.
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 recuperar 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: 8Folha de consulta
Em C, podemos simular a programação orientada a objetos combinando structs (dados) com funções (comportamento) que operam nessas structs.
Defina uma struct para manter o estado:
typedef struct {
int value;
} Counter;
Crie funções que atuam como "métodos" aceitando a struct como um parâmetro:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Use a struct e as funções juntas:
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Imprime: 1
A convenção de nomenclatura typename_action (ex: counter_increment) ajuda a organizar o código e esclarece em qual struct uma função opera.
Experimente você mesmo
#include <stdio.h>
#include "counter.h"
int main() {
// Ler entrada
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: Criar um Counter e inicializá-lo com starting_value
// TODO: Chamar counter_increment o número de vezes especificado
// TODO: Usar counter_get para recuperar 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 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