Edward Bartolo <edb...@gmail.com> writes:
> Is it possible to use classes and objects while using gtk2/3? I
> noticed that only functions are used and that class use is ovoided by
> prepending functions with a group string. As far as I know, C can
> still use structs that are attached to a set of data and a set of
> functions, but without inheritance and polymorphyism.

C structs can be embedded into each other which means they can 'inherit'
other structs, eg, for a totally contrived example

struct something {
        int number0, number1;
};

struct another {
        struct something parent;
        int drei;
};

Assuming

struct another *pa

the elements of the embedded struct can now be accessed as

pa->parent.number0

and a this pointer can be casted to a struct something * pointing at the
first member which can thus be passed to functions expecting such a
pointer as an argument.

Further, the relatively puny "polymorphism support" of Pascal or C++ is
easily implemented without help from the compiler. One can create
structures of function pointers like this

struct something_vtable {
        int (*calc)(struct something *);
};

embed a pointer to that into the structure. Derived 'classes' can have
their own vtable structures and hence, supply alternate functions to
execute.

This mechanism as certain tendency make C++ developers go bezerk with a
particular type of strong rage, but it's entirely usuable in practice,
although more work than having it all laid out for oneself.

Working example:

------------
#include <stdio.h>

/*  metainformation */
struct something;

struct something_vtable {
    int (*calc)(struct something *);
};

/*  something */
struct something {
    struct something_vtable *vt;
    int number0, number1;
};

static int calc_something(struct something *sth)
{
    return sth->number0 + sth->number1;
}

static struct something_vtable sth_vt = {
    .calc = calc_something
};

static void init_something(struct something *sth, int n0, int n1)
{
    sth->vt = &sth_vt;
    sth->number0 = n0;
    sth->number1 = n1;
}

static int calc(struct something *sth)
{
    return sth->vt->calc(sth);
}

/*  another */
struct another {
    struct something parent;
    int drei;
};

static int calc_another(struct something *sth)
{
    struct another *ath = (void *)sth;
    return ath->drei + calc_something(sth);
}

static struct something_vtable ath_vt = {
    .calc = calc_another
};

static void init_another(struct another *ath, int n0, int n1, int d)
{
    init_something((void *)ath, n0, n1);
    ath->parent.vt = &ath_vt;
    ath->drei = d;
}

/*  example program */
void print_result(struct something *sth)
{
    printf("Result: %d\n", calc(sth));
}

int main(void)
{
    struct something sth;
    struct another ath;

    init_something(&sth, 1, 2);
    init_another(&ath, 1, 2, 3);

    print_result(&sth);
    print_result((void *)&ath);

    return 0;
}
_______________________________________________
Dng mailing list
Dng@lists.dyne.org
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to