Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Vamos 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 struct Counter com um único membro int 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) e counter_get (recebe um ponteiro para Counter e retorna seu valor atual). Use include guards com o símbolo COUNTER_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: 8

Folha 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;
}
quiz iconTeste seus conhecimentos

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