Skip to content

Ejemplo POO 2

Gabriel_Sosa edited this page Aug 11, 2020 · 10 revisions

Ejemplo POO 2: Definición de Clases en C (user space)

Para lograr obtener una estructura al estilo de una clase en el lenguaje C se pueden seguir patrones de diseño que permitan un estilo de programación en base al paradigma de programación orientado a objeto, en resumen se deberá cumplir con:

  • Uso de estructura de datos adaptada al estilo de una clase.
  • Uso de estructuras opacas para lograr mayor encapsulamiento de datos.
  • Protección de inclusión en los archivos de cabecera para incluir clases creadas en cualquier parte del código fuente global.

Con estos patrones de diseño del lenguaje C definir una clase es bastante sencillo. Por ejemplo la clase personas seria simplemente como muestran los siguientes códigos.

Archivo cabecera de la clase:

// Persona_c.h
#ifndef CLASE_PERSONA_H                   /* protección de inclusión */
#define CLASE_PERSONA_H

typedef struct persona_struct Persona_c;  /* estructura opaca de clase persona*/
 
/* Vtable de clase persona*/
struct p_metodos
{
  int (*getEdad)(Persona_c *);
  float (*getAltura)(Persona_c *);
};
 
/* Estructura de la clase persona*/
struct persona_struct
{
   /* Atributos */
   int edad;
   float altura;
 
   /* Metodos */
   const struct p_metodos *metodos;
};
 
/* Declaración de métodos de clase persona*/
void new_Persona(Persona_c *p);

int edadPersona(Persona_c *p);
float alturaPersona(Persona_c *p);

#endif /* CLASE_PERSONA_H */

Archivo fuente de la clase:

// Persona_c.c
#include <stdio.h>
#include <stdlib.h>
#include "Persona_c.h"

/* Asignación de métodos a vtable de clase persona*/
struct p_metodos vtable_Persona = {
	.getEdad = edadPersona,
	.getAltura = alturaPersona
};
 
/* Implementación de constructores de clase Persona*/
void new_Persona(Persona_c *p){

	/* Asignación de métodos de objeto persona con la vtable de la clase persona. */
	p->metodos = &vtable_Persona;
 
	/* Inicialización por defecto de atributos del objeto. */
	p->edad= 0;
	p->altura= 0;
}
 
/* Implementación de métodos de clase Persona*/
int edadPersona(Persona_c *p){ return p->edad; }
float alturaPersona(Persona_c *p){ return p->altura; }

Utilizando el diseño propuesto sobre la función principal de un programa de espacio usuario, se puede observar un estilo de programación basado en el paradigma orientado a objetos, tal como muestra el siguiente ejemplo:


Uso de clases en función principal espacio usuario:

// main.c
#include <stdio.h>
#include <string.h>
#include "Persona_c.h"

int main()
{
	Persona_c persona_1;
	new_Persona(&persona_1);

	printf("Edad de persona: %d \n", persona_1.metodos->getEdad(&persona_1));
	printf("Altura de persona: %.2f \n", persona_1.metodos->getAltura(&persona_1));

	return 0;
}

Para trabajar con objetos con datos de gran tamaño es recomendable crear los objetos usando la memoria del heap (memoria reservada en tiempo de ejecución o memoria dinámica). Para esto solo se debe crear un nuevo constructor que permita la creación de objetos usando la memoria del heap. De esta forma se utiliza la memoria de pila (stack) de un proceso para las funciones y metodos que la requieren evitando su saturación. El ejemplo POO 3 muestra esta idea con el que se obtienen programas mas eficientes en la gestión de memoria.

Los patrones de diseño utilizados, también son validos para el espacio kernel en la implementación y construcción de DDL. El ejemplo POO 4 muestra como implementar la clase persona en el kernel de Linux.

Descarga el código fuente del ejemplo aquí.



<< Anterior | Home | Siguiente >>

Clone this wiki locally