Оглавление

Регистрация типа - ссылки

Основные виды регистрации ссылки : asBEHAVE_FACTORY, asBEHAVE_ADDREF и asBEHAVE_RELEASE. Если необходимо копирование ссылки, оператор присваивания регистрируется с помощью asBEHAVE_ASSIGNMENT. Другие операторы могут быть зарегистрированы по мере необходимости.
// Регистрация ссылки
r = engine->RegisterObjectType("ref", 0, asOBJ_REF); assert( r >= 0 );
Рекомендуется:
Дополнение Строка как пример типа-ссылки.

Фабричная функция

Фабричная функция используется для создания объекта объявленного типа. Она несет ответственность за распределение и инициализацию объектов в памяти.

По умолчанию фабричная функция не принимает никаких параметров и должна возвращать хендл на новый объект. Убедитесь, что на счетчик ссылок объекта возвращается фабричной функцией.

CRef::CRef()
{
    // Инициализируем счетчик ссылок единицей
    refCount = 1;
}

CRef *Ref_Factory()
{
    // Конструктор класа инициализирует счетчик ссылок единицей
    return new CRef();
}

//  Регистрация фабрики
r = engine->RegisterObjectBehaviour("ref", asBEHAVE_FACTORY, "ref@ f()", asFUNCTION(Ref_Factory), asCALL_CDECL); assert( r >= 0 );

Вы также можете зарегистрировать фабричные функций, которые принимают параметры, которые затем могут быть использованы при инициализации объекта.

Фабричные функции должны регистрироваться в качестве глобальных функции, но могут быть реализованы как статические методы класса, общей глобальной функцией или глобальной функцией, преследующей общее соглашение о вызовах.

Добавление\уничтожение ссылки

void CRef::Addref()
{
    // Увеличиваем счетчик ссылок
    refCount++;
}

void CRef::Release()
{
    // Уменьшаем счетчик ссылок и удаляем если он достигает нуля
    if( --refCount == 0 )
        delete this;
}

// Регистрируем addref/release
r = engine->RegisterObjectBehaviour("ref", asBEHAVE_ADDREF, "void f()", asMETHOD(CRef,AddRef), asCALL_THISCALL); assert( r >= 0 );
r = engine->RegisterObjectBehaviour("ref", asBEHAVE_RELEASE, "void f()", asMETHOD(CRef,Release), asCALL_THISCALL); assert( r >= 0 );

Присвоение

CRef &CRef::operator =(const CRef &other)
{
    // Копируем всю информацию из другого класса, кроме счетчика ссылок.
}

// Регистрируем присвоение
r = engine->RegisterObjectBehaviour("ref", asBEHAVE_ASSIGNMENT, "ref &f(const &in)", asMETHOD(CRef,operator=), asCALL_THISCALL); assert( r >= 0 );

Присвоение может быть перегружено другими видами, если это необходимо, таким образом скриптеру не нужно вручную преобразовать выражения перед присвоением значений этого типа.

Регистрация ссылочных типов, которые нельзя создать

Иногда может быть полезной регистрация типа, который не может быть создан в скрипте. Вы можете сделать это, зарегистрировав тип как ссылку, но без asBEHAVE_FACTORY. Позже вы сможете зарегистрировать глобальные свойства или функции, которые позволяют скрипту обращаться к объектам, созданных приложением через хендлы.

Данный метод может очень пригодиться для singleton или pooled object.


Перевод - arroy.one@gmail.com. При копировании материалов указывайте ссылку на источник.