Есть ли способ, которым я могу в функции 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, ни один не дал никакого результата.
Сбой, который я получаю, является необработанным исключением в 0x0059a064 в program.exe: 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
Любая помощь приветствуется.
Почему вы хотите указатель класса в коде lua? Как класс C ++, он будет непрозрачным … или лучше будет. ~ Улыбка ~
Возможно, установите std :: map в коде C ++ и сохраните указатель на карте со значением хеша и передайте значение хеша в lua? Затем lua может использовать это для возврата к коду C ++ в другом месте.
РЕДАКТИРОВАТЬ: Вы можете разыменовать P
немного и передать хэш в качестве замены для this
в P
,
Имейте в виду, что thing:Method()
это просто сокращение для thing.Method( thing )
— так, используя хеш для thing
все еще в значительной степени та же самая конструкция, но немного меньше ОО по внешнему виду.
Нечто подобное будет работать …
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 );
и т.п.
Это не идеальное решение, но оно должно помочь вам решить проблему, с которой вы столкнулись. Надеюсь, кто-то еще может прийти с лучшим ответом?
RE-EDIT: Если подумать, хотя это немного громоздко, может быть другой способ, который позволит вам использовать класс P (косвенно) через прокси-класс в Lua …
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)
]
Других решений пока нет …