在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
任何帮助表示感谢。
答案 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)
]