gpt4 book ai didi

c++ - Lua C++ 用户数据

转载 作者:行者123 更新时间:2023-11-30 05:41:54 25 4
gpt4 key购买 nike

我正在尝试访问用户数据的类型,以便我可以相应地处理它。假设我有一个名为 Foo 的类:

class Foo:public CObject
{
public:
Foo():CObject(){}
int type() {return 1;}
}

class CObject
{
public:
virtual int type(void)=0;
}

基本原理是扩展 CObject 的每个类都有一个类型,该类型必须由整数(稍后在枚举中)表示。 Foo 类使用 luaWwrapper (//https://bitbucket.org/alexames/luawrapper/src/fd9c4fdbf4b25034e3b8475a2c8da66b7caab427?at=default) 绑定(bind)到 lua。

  Foo* Foo_new(lua_State* L)
{
Foo* f=new Foo();
lua_newuserdata(L,sizeof(f));
std::cout<<"f="<<f;
return f;
}

在 Lua 中用户称它为:

f=Foo.new() 
print(f)

现在我有了一个 C++ 函数,比如打印:

int lua_print(lua_State* L)
{
void *ud = luaL_checkudata(L, 1, "Foo"); //ud is not zero
std::cout<<"ud="<<ud;
CObject* obj=(CObject*)ud; //Casting to CObject
int objtype=obj->type(); //program CRASHES here

我看到程序崩溃导致Fooud的内存地址不一样。我假设 ud 指的是堆栈内存,其中包含Foo 的内存地址。如何访问堆栈的内存地址或 Foo 的首选内存地址?

最佳答案

您必须使用 placement new 来初始化 lua_newuserdata 返回的内存中的对象。

行内的事

void *ud = lua_newuserdata(L,sizeof(Foo));
new (ud) Foo();

关于c++ - Lua C++ 用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30960986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com