Вернуть указатель класса на 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, ни один не дал никакого результата.

Сбой, который я получаю, является необработанным исключением в 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

Любая помощь приветствуется.

1

Решение

Почему вы хотите указатель класса в коде 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)
]
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]