Я нашел решение для моей ситуации.
Изучив ответы от Moia и ixSci, я понял, что я был прав в своем утверждении, что размещение нового нельзя использовать на QObject
, потому что QObject
имеет свой конструктор копирования частный (и его не следует публиковать ).
Более эффективным методом является (очевидно) сохранение указателей на QObject*
, созданный из metaObject->newInstance()
. Это верно, указатели на указатели.
Новый код выглядит следующим образом:
const QMetaObject *metaObject = (const QMetaObject*)lua_touserdata(L, lua_upvalueindex(1));
uintptr_t *ptr = (uintptr_t*)lua_newuserdata(L, sizeof(QObject*));
QObject *object = metaObject->newInstance();
*ptr = reinterpret_cast<uintptr_t>(object);
И для получения:
uintptr_t *objectPointer = (uintptr_t*)lua_touserdata(L, -1);
QObject *object = static_cast<QObject*>((void*)*objectPointer);
Положительным моментом является то, что lua может выделить фиксированный размер для любого объекта класса, поскольку он всегда равен 4 (только указатель). Это означает, что мне не нужно выполнять какую-либо проверку типов.
Очевидным недостатком этого является то, что я не могу выполнять какую-либо проверку типов, поскольку она всегда будет просто указателями. Кроме того, все взаимодействия с этими типами внутри скрипта Lua будут вести себя как указатели. Все копии будут копиями указателя вместо QObject
копий. В результате мне придется реализовать свой собственный конструктор копирования для моего QObject's
в зависимости от конкретного случая использования.
Спасибо за вашу помощь!