
Tipicamente, otteniamo una descrizione di classe spedendo new() ad una descrizione di metaclasse. Nel caso di Class e Object vediamo le seguenti chiamate:
const void * Object = new(Class, "Object", Object, sizeof(struct Object), ctor, Object_ctor, dtor, Object_dtor, differ, Object_differ, puto, Object_puto, 0); const void * Class = new(Class, "Class", Object, sizeof(struct Class), ctor, Class_ctor, dtor, Class_dtor, 0);
Sfortunatamente, entrambe le chiamate si affidano l'una all'altra prima che siano state completate. Di conseguenza, l'implementazione di Class e Object in Object.c richiede una inizializzazione statica delle descrizioni di classe.
Questo è l'unico punto in cui inizializziamo esplicitamente una struct Class.
static const struct Class object [] = { { { object + 1 }, "Object", object, sizeof(struct Object), Object_ctor, Object_dtor, Object_differ, Object_puto }, { { object + 1 }, "Class", object, sizeof(struct Class), Class_ctor, Class_dtor, Object_differ, Object_puto } }; const void * Object = object; const void * Class = object + 1;
Un nome di array è l'indirizzo del primo elemento dell'array e possiamo già utilizzarlo per inizializzare i componenti degli elementi. Faremo in seguito riferimento all'inizializzazione di struct Object per farvi notare aspetti interessanti dell'inizializzazione tramite array.
