Menu
Coddy logo textTech

Getters y Setters

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 19 de 61.

Con los punteros opacos, los miembros de la estructura están ocultos para el código externo. Pero si el código externo no puede acceder directamente a los datos, ¿cómo los leemos o modificamos? La respuesta son las funciones getter y setter: interfaces públicas que proporcionan un acceso controlado a los datos privados.

Un getter devuelve el valor de un miembro oculto:

// counter.h
int counter_get_value(const Counter *c);

// counter.c
int counter_get_value(const Counter *c) {
    return c->value;
}

Un setter modifica un miembro oculto:

// counter.h
void counter_set_value(Counter *c, int new_value);

// counter.c
void counter_set_value(Counter *c, int new_value) {
    c->value = new_value;
}

Observa la convención de nombres: antepone a las funciones el nombre del tipo (counter_) para evitar conflictos y hacer clara la API. Los getters usan punteros const porque no modifican el objeto.

Ahora el código externo puede interactuar de forma segura con los datos ocultos:

// main.c
Counter *c = create_counter(10);
printf("%d\n", counter_get_value(c));  // 10
counter_set_value(c, 25);
printf("%d\n", counter_get_value(c));  // 25

Este patrón te brinda control total sobre cómo se accede a los datos: una base sobre la que construiremos en la próxima lección, cuando añadamos lógica de validación a los setters.

challenge icon

Desafío

Fácil

Construyamos un módulo Score que use el patrón de puntero opaco con funciones getter y setter. Crearás un rastreador de puntuación oculto con el que el código externo solo podrá interactuar a través de la interfaz pública que proporciones.

Crearás tres archivos:

  • score.h: Tu interfaz pública. Declara un tipo Score opaco mediante una declaración anticipada (¡sin cuerpo de struct!). Declara estas funciones:
    • create_score: recibe un entero con los puntos iniciales y devuelve un puntero a Score
    • free_score: recibe un puntero a Score y libera la memoria
    • score_get_points: un getter que recibe un const Score * y devuelve los puntos actuales
    • score_set_points: un setter que recibe un Score * y un entero, y actualiza el valor de los puntos
    Usa protectores de inclusión con el símbolo SCORE_H.
  • score.c: Define la struct Score real con un único miembro oculto: int points. Implementa las cuatro funciones. Tu getter debe devolver el valor oculto y tu setter debe actualizarlo. Recuerda que los getters usan punteros const porque no modifican el objeto.
  • main.c: Demuestra tu módulo creando una puntuación, leyendo su valor, modificándolo mediante el setter y volviéndolo a leer.

Recibirás dos entradas: los puntos iniciales (un entero) y el nuevo valor de los puntos (un entero) que se establecerá.

En tu archivo principal, crea un Score con los puntos iniciales, imprime el valor actual usando el getter, actualízalo usando el setter con el nuevo valor, imprime el valor actualizado, después libera la puntuación e imprime una confirmación.

Imprime la salida con este formato:

Initial: {points}
Updated: {points}
Freed

Por ejemplo, con las entradas 100 y 250, la salida sería:

Initial: 100
Updated: 250
Freed

Observa cómo main.c no puede acceder directamente a points. Debe hacerlo mediante tus funciones getter y setter. Esto es la encapsulación en acción: controlas exactamente cómo se pueden leer y modificar los datos ocultos.

Pruébalo tú mismo

#include <stdio.h>
#include "score.h"

int main() {
    int initial_points, new_points;
    scanf("%d", &initial_points);
    scanf("%d", &new_points);
    
    // TODO: Crea un Score con initial_points
    
    // TODO: Imprime el valor inicial usando el getter
    // Formato: "Initial: {points}"
    
    // TODO: Actualiza el score usando el setter con new_points
    
    // TODO: Imprime el valor actualizado usando el getter
    // Formato: "Updated: {points}"
    
    // TODO: Libera el score e imprime "Freed"
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online