cobject-oriented-analysis

Declaring object classes in C?


I declared a few geometric figures types such as:

typedef struct s_sphere{
    t_tuple origin;
    double  radius;
} t_sphere;

typedef struct s_cylinder{
    t_tuple origin;
    double  height;
    double  radius;
} t_cylinder;

typedef struct s_triangle{
    t_tuple A;
    t_tuple B;
    t_tuple C;
} t_triangle;

etc...

Now, I would like to declare an intersection type which will contain two doubles and a geometric figure. I will then store all my intersections in a chained list:

// I do not know what type to give to geometric_figure
typedef struct  s_intersection{
    double       t1;
    double       t2;
//  what_type    geometric_figure;
} t_intersection;

typedef struct  s_intersection_list{
    t_intersection              intersection;
    struct s_intersection_list  *next;
} t_intersection_list;

I could use void* geometric_figure but I would like to avoid the most mallocs possible.
Is there a handy way of getting where I want without allocating geometric_object ?


Solution

  • type which will contain two doubles and a geometric figure.

    Consider union with an identifier.

    typedef struct  s_intersection{
      double       t1;
      double       t2;
      int id;  // some id to know what type follows
      union {
        t_sphere sph;
        t_cylinder cyl;
        t_triangle tri;
      } u;
    } t_intersection;
    

    If t_intersection is to be allocated, consider a flexible member array to right size the allocation.

    typedef struct  s_intersection{
      double       t1;
      double       t2;
      int id;  // some id to know what type follows
      union {
        t_sphere sph;
        t_cylinder cyl;
        t_triangle tri;
      } u[];   // FAM
    } t_intersection;
    

    Example: allocate a triangle.

    t_intersection *p = malloc(sizeof *p + sizeof p->u[0].tri);