Facebook Google+


[C] Dejando atrás lo básico
#1
Hablamos de C, no de C++.

Os voy a proponer algo interesante:

Dado el siguiente código implementar una pequeña libería que lo haga posible.

Código:
#include <stdio.h>
#include "object.h"

int main() {
    obj_instance *oi1;
    obj_instance *oi2;
    
    object_init();
    
    oi1 = Object.New();
    oi2 = Object.New();

    Object.Set(oi1, 5);
    Object.Set(oi2, 3);
    
    printf("valor de oi1: %d\n", Object.Get(oi1));
    printf("valor de oi2: %d\n", Object.Get(oi2));

    printf("oi1 y oi2 ");
    if(!Object.Equals(oi1, oi2))
        printf("NO ");
    printf("son iguales.\n");

    Object.Set(oi2, 5);
    
    printf("valor de oi1: %d\n", Object.Get(oi1));
    printf("valor de oi2: %d\n", Object.Get(oi2));
    
    printf("oi1 y oi2 ");
    if(!Object.Equals(oi1, oi2))
        printf("NO ");
    printf("son iguales.\n");
   
    Object.Free(oi1);
    puts("oi1 liberado.");
    
    Object.Free(oi2);
    puts("oi2 liberado.");
}

La salida del programa será:

Cita:valor de oi1: 5
valor de oi2: 3
oi1 y oi2 NO son iguales.
valor de oi1: 5
valor de oi2: 5
oi1 y oi2 son iguales.
oi1 liberado.
oi2 liberado.
 

Una restricción:

Los datos de los objetos tipo obj_instance solo pueden ser accedidos a través de las funciones de la librería Object.Función. Te ajudará también el dato de que no se puede adquirir memoria usando obj_instance como argumento se malloc. Es decir que el siguiente código, escrito por el cliente de tu librería, debería fallar:

Código:
obj_instance *un_objeto = malloc(sizeof(obj_instance));
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#2
Está interesante! seguro este desafío va a interesar a más de uno
 
Reply
#3
Que bueno se vuelva a proponer cosas interesantes como esta en el foro
 
Reply
#4
Seguramente me sume al desafío, tengo en mente algunas posibles soluciones, así que solo queda probar. Saludos
 
Reply
#5
Estupendo! Será interesante ver tu solución  Smile
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#6
Se me ocurre con ...



Spoiler:






EDITO: me acaban de avisar de un compromiso.... me tocó abordar pero esta muy bueno el desafio, espero poder completarlo pronto!

Por favor usen la etiqueda [HIDE] para ocultar sus soluciones que no quiero verlas de re-ojo y terminar haciendo trampa Tongue
 
Reply
#7
Que sea leve. Estamos la epectativa de tu solución.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#8
El lenguaje C no fue diseñado para POO pero de igual manera proporciona algunas facilidades limitadas que permiten emularlo.

object.h

Código:
#ifndef OBJECT_H_INCLUDED
#define OBJECT_H_INCLUDED

typedef struct obj_instance obj_instance;

typedef struct Object_vtable {
    void (*Set)(obj_instance *, int);
    int (*Get)(obj_instance *);
    int (*Equals)(obj_instance *, obj_instance *);
    obj_instance *(*New)();
    void (*Free)();
} Object_vtable;

extern Object_vtable Object;

void object_init();

#endif // OBJECT_H_INCLUDED

object.c

Código:
#include "object.h"

typedef struct obj_instance {
    int value;
} obj_instance;

Object_vtable Object;

void Set(obj_instance *instance, int value) {
    instance->value = value;
}

int Get(obj_instance *instance) {
    return instance->value;
}

int Equals(obj_instance *a, obj_instance *b) {
    return a->value == b->value;
}

obj_instance *New() {
    obj_instance *instance = (obj_instance *) malloc(sizeof(obj_instance));
    instance->value = 0;
    return instance;
}

void Free(obj_instance *instance) {
    free(instance);
}

void object_init() {
    Object.New = New;
    Object.Free = Free;
    Object.Equals = Equals;
    Object.Get = Get;
    Object.Set = Set;
}

Creo es mejor no reinventar la rueda y usar lenguajes orientados a ese propósito como C++
 
Reply
#9
Olé. Buena solución.

Pero recordar de poner las guardas en los archivos de cabecera.

Es cierto que no es un lenguaje orientado a objetos y que para ello ya está C++, pero jugar con C y su preprocesador para hacer cosas diferentes es bastante divertido.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
  


Salto de foro:


Browsing: 1 invitado(s)