elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Estructuras con miembros privados.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Estructuras con miembros privados.  (Leído 1,858 veces)
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
[C] Estructuras con miembros privados.
« en: 21 Abril 2016, 23:45 pm »

Como digo esto se trata de C y no de C++.

Es posible emular, en C, el comportamiento de miembros privados de datos definidos por el programador, al estilo de la POO, para que los usuarios de esa estructura no puedan acceder directamente a los datos que hay dentro de ella.

Las ventajas que tiene esta técnica:
1. El usuario no puede modificar los datos directamente y deben pasar por los filtros que imponga el programador.
2. El programador puede cambiar los datos internos que tiene la estructura y su interfaz (funciones getters y setters) sin que el usuario tenga que recompilar todo su código para hacer uso de estas modificaciones.

Los inconvenientes:
1. Sólo se puede situar la estructura en memoria del montón con lo que aparece el problema de la fragmentación de la memoria
2. La memoria se debe liberar ya sea mediante free o una función que proporcione el programador a modo de destructor.

Aquí va el código:


dato.h
Código
  1. #ifndef __DATO_H__
  2. #define __DATO_H__
  3.  
  4. typedef struct __dato__ DATO;
  5.  
  6. DATO* new_dato();
  7. void delete_dato(DATO* objeto);
  8. int get_dato(DATO* objeto);
  9. void set_dato(DATO* objeto, int valor);
  10.  
  11. #endif


dato.c
Código
  1. #include <stdlib.h>
  2. #include "dato.h"
  3.  
  4. struct __dato__ {
  5.    int miembro_privado;
  6. };
  7.  
  8. DATO* new_dato() {
  9.    DATO* d = malloc(sizeof(DATO));
  10.    d->miembro_privado = 0;
  11.    return d;
  12. }
  13.  
  14. void delete_dato(DATO* objeto) {
  15.    free(objeto);
  16. }
  17.  
  18. int get_dato(DATO* objeto) {
  19.    return objeto->miembro_privado;
  20. }
  21.  
  22. void set_dato(DATO* objeto, int valor) {
  23.    objeto->miembro_privado = valor;
  24. }



Ahora el cliente:

main.c
Código
  1. #include <stdio.h>
  2. #include "dato.h"
  3.  
  4. int main() {
  5.    DATO *d;
  6.  
  7.    d = new_dato();
  8.    set_dato(d, 5);
  9.    printf("%i\n", get_dato(d));
  10.  
  11.    /* d->miembro_privado = 4; /* <- Esto va a fallar */
  12.    /* printf("%i\n", get_dato(d)); */
  13.  
  14.    delete_dato(d);
  15.  
  16.    return 0;
  17. }


« Última modificación: 22 Abril 2016, 15:44 pm por MAFUS » En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [C] Estructuras con miembros privados.
« Respuesta #1 en: 21 Abril 2016, 23:55 pm »

Hola,

No sé porque hacer d->miembro_privado = 10 en el main debería dar error, de hecho lo he probado y funciona correctamente.

En qué momento se supone que restringes que no se pueda hacer eso? Porque yo solo veo una declaración de un struct, una función que devuelve un puntero a un struct del tipo declarado, y dos funciones para modificar u obtener el valor del campo miembro_privado, lo que suele ser algo bastante normal.

Saludos!


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: [C] Estructuras con miembros privados.
« Respuesta #2 en: 22 Abril 2016, 00:11 am »

Si estás detrás de un compilador GCC o parecido este es el makefile:

Código
  1. CC=gcc
  2.  
  3. p: main.o dato.o dato.h
  4. ${CC} main.o dato.o dato.h -o p
  5. dato.o: dato.c dato.h
  6. ${CC} -c dato.c dato.h
  7. main.o: main.c dato.h
  8. ${CC} -c main.c dato.h

Aquí se generan dos objetos que después se enlazan: por un lado el propio del tipo de dato, aquí dato.o, y por otro el del cliente consumidor del tipo de dato, aquí main.o.
dato.o se compila a partir de dato.c, del cual el cliente no sabe nada, y dato.h. Como programador darás el objeto generado y la cabecera dato.h a tu cliente.

Tu cliente hará su propio programa incluyendo la cabecera dato.h a su código (aquí representado por main.c) y enlazando su código objeto, aquí representado por main.o, con el que tu le proporcionas.
Compilado de esta forma no puede acceder al miembro del struct ya que solo ve el dato incompleto de la cabecera. Los datos internos están ocultos en el código objeto.
Lo único que ve el cliente es la interfaz proporcionada por el archivo de cabecera.
« Última modificación: 22 Abril 2016, 09:11 am por MAFUS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Control de accesos a Miembros en C#
.NET (C#, VB.NET, ASP)
CATBro 0 2,230 Último mensaje 29 Enero 2012, 23:14 pm
por CATBro
Plantilla actualizable de miembros en una web
Desarrollo Web
as if 4 2,854 Último mensaje 20 Junio 2013, 18:57 pm
por engel lex
Acceder a miembros de objetos
Programación C/C++
acega 1 1,676 Último mensaje 9 Octubre 2013, 18:34 pm
por vangodp
Como eliminar miembros de una tdu en c++
Programación C/C++
daviddl 0 1,241 Último mensaje 20 Febrero 2016, 09:00 am
por daviddl
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines