Ich habe eine Klasse in C ++ namens "Point":
%Vor%Mein Ziel ist es, ein Point-Objekt mit einem Lua-Skript zu instantiieren und den Zeiger auf dieses Objekt vom Lua-Stack zu extrahieren.
Hier ist mein (momentan nicht funktionierender) Versuch, der hoffentlich klarstellt, was genau ich versuche; Beachten Sie, dass dieser Code im Wesentlichen von dieses Tutorial geändert und kopiert wird dass ich Lua 5.2 verwende:
%Vor%Und hier ist das Lua-Skript:
%Vor%Wenn ich diesen Code ausführe, erhalte ich den folgenden Fehler: "schlechtes Argument # 3 (Point expected, get table)" an der Zeile: ud = luaL_checkudata (L, index, "Punkt") innerhalb der Funktion checkPoint ().
Wenn mich jemand in die richtige Richtung lenken könnte, wäre das sehr zu begrüßen.
Es gibt ein paar Probleme in Ihrer obigen Verwendung und Bindung.
In Ihrem Testscript wird local point
nicht von Ihrem Host-C ++ - Programm gesehen. Das liegt daran, dass es lokal für dieses Skript ist. Wenn Sie auf c ++ zugreifen möchten, geben Sie point
als Wert aus dem Skript zurück oder machen Sie es global und rufen Sie es mit lua_getglobal(L, "point")
ab.
Die Funktion checkPoint
enthält unnötigen Code. Wenn Sie sich die anderen luaL_check*
-Funktionen ansehen, die von der Lua C-API bereitgestellt werden, überprüfen sie hauptsächlich, ob der angegebene Wert im Stack-Index der richtige Typ ist. Wenn es dann ist, konvertieren Sie diesen Typ in etwas, das C ++ verwenden kann.
Also müssen Sie in Ihrer "checkPoint" -Funktion nur Folgendes tun:
%Vor%Wenn Sie Ihr Skript in dieses ändern, zum Beispiel:
%Vor% Sie sollten in der Lage sein, auf point
von C ++ wie folgt zuzugreifen:
Ein weiterer wichtiger Punkt ist die Lebensdauer von C ++ - Objekten, wenn sie Lua ausgesetzt sind. Da Sie den C ++ - Operator 'new' zuweisen und konstruieren, wenn Point.new
aus dem Skript aufgerufen wird, sagen Sie indirekt, dass lua die Lebensdauer dieses exposed C ++ - Objekts behandeln soll . Das bedeutet, dass Sie auch ein __gc
metamethod implementieren möchten, um als Finalizer oder nichtdeterministischer Destruktor zu agieren. Ohne dies hätten Sie keine Möglichkeit, das point
-Objekt zu 'löschen' und den Speicherplatz zurückzugeben, wenn lua garbage die entsprechenden Benutzerdaten sammelt.
Um dies zu tun, können Sie Ihren Code wie folgt erweitern:
Schreibe eine deletePoint
Funktion, die von lua auf userdata gc aufgerufen wird.
Fügen Sie das zu Ihrem pointFuncs
hinzu, damit lua darüber Bescheid weiß.
Ich würde empfehlen, keine eigene Bindung zu schreiben, sondern stattdessen eine getestete und dokumentierte zu verwenden, wie luabridge oder luabind
Ihre Bindung würde reduziert auf:
%Vor%und dein lua würde aussehen wie
%Vor%mit luabridge.
Informationen zum Extrahieren von Werten finden Sie beispielsweise in LuaRef in luabridge . Wenn Sie c ++ 11 verwenden, gibt es einige andere, ziemlich schöne lua-bindende Bibliotheken.