// Регистрация ссылки 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 );
Присвоение может быть перегружено другими видами, если это необходимо, таким образом скриптеру не нужно вручную преобразовать выражения перед присвоением значений этого типа.
Данный метод может очень пригодиться для singleton или pooled object.