2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
返回对象写法
MatTest createMatTest(string txt) {
MatTest res(txt);
return res;
};
//返回指针写法
MatTest* createMatTest1(string txt) {
return new MatTest(txt);
};
Die Methode zum Schreiben des zurückgegebenen Objekts besteht darin, den Speicher in Lua automatisch freizugeben
Das Objekt, das den Zeiger zurückgibt, gibt den Speicher selbst frei
/**
Wraps a pointer to a class object inside a Lua userdata.
The lifetime of the object is managed by C++.
*/
class UserdataPtr : public Userdata
{
private:
UserdataPtr(UserdataPtr const&);
UserdataPtr operator=(UserdataPtr const&);
private:
/** Push a pointer to object using metatable key.
*/
static void push(lua_State* L, const void* p, void const* const key)
{
new (lua_newuserdata(L, sizeof(UserdataPtr))) UserdataPtr(const_cast<void*>(p));
lua_rawgetp(L, LUA_REGISTRYINDEX, key);
if (!lua_istable(L, -1))
{
lua_pop(L, 1); // possibly: a nil
throw std::logic_error("The class is not registered in LuaBridge");
}
lua_setmetatable(L, -2);
}
template<class T>
class UserdataValue : public Userdata
{
private:
UserdataValue(UserdataValue<T> const&);
UserdataValue<T> operator=(UserdataValue<T> const&);
char m_storage[sizeof(T)];
private:
/**
Used for placement construction.
*/
UserdataValue() { m_p = 0; }
~UserdataValue()
{
if (getPointer() != 0)
{
getObject()->~T();
}
}
public:
/**
Push a T via placement new.
The caller is responsible for calling placement new using the
returned uninitialized storage.
@param L A Lua state.
@returns An object referring to the newly created userdata value.
*/
static UserdataValue<T>* place(lua_State* const L)
{
UserdataValue<T>* const ud =
new (lua_newuserdata(L, sizeof(UserdataValue<T>))) UserdataValue<T>();
lua_rawgetp(L, LUA_REGISTRYINDEX, detail::getClassRegistryKey<T>());
if (!lua_istable(L, -1))
{
throw std::logic_error("The class is not registered in LuaBridge");
}
lua_setmetatable(L, -2);
return ud;
}
/**
Push T via copy construction from U.
@tparam U A container type.
@param L A Lua state.
@param u A container object reference.
*/
template<class U>
static inline void push(lua_State* const L, U const& u)
{
UserdataValue<T>* ud = place(L);
new (ud->getObject()) U(u);
ud->commit();
}