Skip to content
Snippets Groups Projects
Select Git revision
  • 37a66dcc1ef3750f45ddd2427b714ffd69d3fd1b
  • master default protected
  • v3-modify-mail
  • snyk-fix-207483a1e839c807f95a55077e86527d
  • translations_3b5aa4f3c755059914cfa23d7d2edcde_ru
  • translations_6e4a5e377a3e50f17e6402264fdbfcc6_ru
  • translations_3b5aa4f3c755059914cfa23d7d2edcde_fa_IR
  • translations_en-yml--master_fa_IR
  • snyk-fix-7d634f2eb65555f41bf06d6af930e812
  • translations_en-yml--master_ar
  • translations_3b5aa4f3c755059914cfa23d7d2edcde_el
  • jfederico-patch-1
  • v2
  • v3
  • v1
  • release-3.1.0.2
  • release-3.1.0.1
  • release-3.1.0
  • release-2.14.8.4
  • release-3.0.9.1
  • release-3.0.9
  • release-3.0.8.1
  • release-2.14.8.3
  • release-3.0.8
  • release-3.0.7.1
  • release-2.14.8.2
  • release-3.0.7
  • release-3.0.6.1
  • release-3.0.6
  • release-3.0.5.4
  • release-3.0.5.3
  • release-2.14.8.1
  • release-3.0.5.2
  • release-3.0.5.1
  • release-3.0.5
35 results

README.md

Blame
  • objects-11.c 1.25 KiB
    #include <stdio.h>
    #include <stdlib.h>
    
    #define T_BASE    0
    #define T_INTEGER 1
    #define T_STRING  2
    
    union t_object;
    
    typedef struct
    {
      int type;
      void (* print) (union t_object *this);
    } t_base;
    
    typedef struct
    {
      int type;
      void (* print) (union t_object *this);
      int content;
    } t_integer;
    
    typedef struct
    {
      int type;
      void (* print) (union t_object *this);
      char *content;
    } t_string;
    
    typedef union t_object
    {
      t_base base;
      t_integer integer;
      t_string string;
    } t_object;
    
    void print_integer (t_object *this)
    {
      printf ("Integer: %d\n", this->integer.content);
    }
    
    void print_string (t_object *this)
    {
      printf ("String: \"%s\"\n", this->string.content);
    }
    
    t_object *new_integer (int i)
    {
      t_object *p = malloc (sizeof (t_integer));
      p->integer.type = T_INTEGER;
      p->integer.print = print_integer;
      p->integer.content = i;
      return p;
    }
    
    t_object *new_string (char *s)
    {
      t_object *p = malloc (sizeof (t_string));
      p->string.type = T_STRING;
      p->string.print = print_string;
      p->string.content = s;
      return p;
    }
    
    int main (void)
    {
      t_object *object[] = { new_integer (42),
                             new_string ("Hello, world!"),
                             NULL };
    
      for (int i = 0; object[i]; i++)
        object[i]->base.print (object[i]);
    
      return 0;
    }