1

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

どんな助けでも感謝します。

4

1 に答える 1

1

lua コードでクラス ポインターが必要なのはなぜですか? C++ クラスとして、それは不透明になります... またはより良いです。〜笑顔〜

おそらく、C++ コードで std::map を設定し、ポインタをマップにハッシュ値とともに格納し、ハッシュ値を lua に渡しますか? その後、lua はそれを使用して、別の場所にある C++ コードに戻すことができます。

編集:P少し逆参照​​して、 thisinの代わりにハッシュを渡すことができPます。

thing:Method()これは for の省略形にすぎないことに注意してください。つまりthing.Method( thing )、hash for を使用して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 );

これは完璧な解決策ではありませんが、抱えている問題を回避できるはずです。うまくいけば、他の誰かがより良い答えを出すことができますか?

再編集:考えてみると、少し面倒ですが、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)
]
于 2013-05-07T21:07:31.993 に答える