使用luabind将类指针返回给lua

时间:2013-05-07 16:39:04

标签: c++ lua luabind

在C ++函数中,有什么方法可以将指向类的指针返回给lua? 我已经尝试过这个,以及其他更绝望的事情:

P* GetP()
{
    return g_P;
}

module(L)
[
    def("GetP", &GetP)
]

这使得程序在main()中运行第一行之前就崩溃了,即使代码只是在一个永远不会被调用的函数中。

我认为这是一个问题,P不为luabind所知,但甚至告诉它它失败了。

module(L)
[
    class_<P>("ClassP")
    .def(constructor<>())
]

这可能是因为P有一个有点复杂的继承层次结构,不确定。

class GO;
class L;
class C : public GO;
class P : public C, L;

我尝试过不同的方法来告诉luabind P的继承,没有给出任何结果。

我得到的崩溃是program.exe中0x0059a064处的未处理异常:0xC0000005:访问冲突读取位置0x00000004,在xtree中找到。

_Pairib insert(const value_type& _Val)
    {   // try to insert node with value _Val
        _Nodeptr _Trynode = _Root();
        _Nodeptr _Wherenode = _Myhead;
        bool _Addleft = true;   // add to left of head if tree empty

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

为什么要在lua代码中使用类指针?作为一个C ++类,它将是不透明的......或者更好。 〜微笑〜

也许在C ++代码中设置一个std :: map并使用哈希值将指针存储在地图中并将哈希值传递给lua?然后,lua可以使用它来传递回其他地方的C ++代码。

编辑:您可以取消引用P并传递哈希值,以替代this中的P

请注意,thing:Method()只是thing.Method( thing )的简写 - 所以,使用thing的哈希仍然大致相同的构造,但外观上的OO略少一些眼。

与此类似的东西可行......

std::map<unsigned,P*> p_Map;

void p_AddValue( unsigned hash, int aValue )
{
    if( p_Map.find( hash ) != p_Map.end() )
        p_Map[hash]->AddValue( aValue );
}

unsigned p_New()
{
    P* p = new P();
    unsigned hash;

    do hash = GenerateHash( p );
    while( p_Map.find( hash ) != p_Map.end() );

    p_Map[hash] = p;

    return hash;
}

module(L)
[
    def("p_AddValue", &p_AddValue)
    def("p_New", &p_New)
]

然后在Lua你应该可以做这样的事情......

local p1 = p_New();
local p2 = p_New();

p_AddValue( p1, 5 );
p_AddValue( p2, 10 );

这不是一个完美的解决方案,但它可以帮助您解决您遇到的问题。希望其他人可能会得到一个更好的答案?

重新编辑:来想一想,虽然有点麻烦,可能还有另一种方法可以让你通过Lua中的代理类使用P类(间接)。

class PProxy
{
    protected:

       P  p;

    public:

       PProxy() : P() {};
       ~PProxy() {};

       void AddValue( int aValue ) { p.AddValue( aValue ); }
}

module(L)
[
    class_<PProxy>("P")
    .def(constructor<>())
    .def("AddValue", &PProxy::AddValue)
]