6.7 Инициализация

Предыдущая  Содержание  Следующая V*D*V

Обычно мы получаем описание класса отсылая new() к описанию метакласса. В случае Class и Object были бы следующие вызовы:

 

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);

 

К сожалению, все вызовы полагаются на то, что другой уже были завершён. Таким образом, реализация Class и Object в Object.c требует статической инициализации описаний классов. Это единственная точка, где мы явно инициализируем 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;

 

Имя массива является адресом первого элемента массива и уже может использоваться для инициализации компонентов элементов. Мы полностью расставили скобки этой инициализации на случай изменения struct Object позже.

 

Предыдущая  Содержание  Следующая