// Регистрация примитивного типа r = engine->RegisterObjectType("pod", sizeof(pod), asOBJ_VALUE | asOBJ_POD); assert( r >= 0 ); // Регистрация класса, который должен быть надлежащим образом инициализирован r = engine->RegisterObjectType("val", sizeof(val), asOBJ_VALUE); assert( r >= 0 );
void Constructor(void *memory) { // Создаем объект new(memory) Object(); } void Destructor(void *memory) { // Очищаем память вызовом деструктора ((Object*)memory)->~Object(); } // Регистрируем отношения r = engine->RegisterObjectBehaviour("val", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(Constructor), asCALL_CDECL_OBJLAST); assert( r >= 0 ); r = engine->RegisterObjectBehaviour("val", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(Destructor), asCALL_CDECL_OBJLAST); assert( r >= 0 );
| asOBJ_APP_CLASS | C++ класс\структура |
| asOBJ_APP_CLASS_CONSTRUCTOR | C++ тип имеет уникальный конструктор |
| asOBJ_APP_CLASS_DESTRUCTOR | C++ тип имеет уникальный деструктор |
| asOBJ_APP_CLASS_ASSIGNMENT | C++ тип имеет уникальный оператор присваивания |
| asOBJ_APP_PRIMITIVE | C++ тип примитивный, но не float или double |
| asOBJ_APP_FLOAT | C++ тип float или double |
Обратите внимание, что они не представляют как тип будет вести себя в скрипте, а только описывают тип, находящийся в главном приложении. Так что если вы хотите зарегистрировать класс С++, который по вашему желанию должен вести себя как примитивный в скрипте, то вы все равно должны использовать флаг asOBJ_APP_CLASS. То же самое остальных флагов. Эти флаги показывают, что класс имеет соответствующую функцию, а не определяют данную функцию в скрипте.
Для класса есть более короткие флаги для каждой комбинации. Они имеют вид asOBJ_APP_CLASS_CDA, где последние буквы означают Constructor \ Destructor \ Assignment behaviour, то есть данный флаг включает в себя следующие asOBJ_APP_CLASS | asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT.
// Регистрация комплексного типа r = engine->RegisterObjectType("complex", sizeof(complex), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); assert( r); assert( r >= 0 );
Убедитесь, что вы правильно указали флаги, в противном случае возникнут различные ошибки при выполнении скриптов. Общие проблемы - повреждение стека и обращение к недействительной памяти. В некоторых случаях вы можете столкнуться с менее заметными ошибками, которые трудно будет обнаружить.