So extrahieren Sie den C ++ - Objektzeiger von Lua

8

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.

    
user2687268 15.08.2013, 21:08
quelle

2 Antworten

8

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:

%Vor%

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.

    %Vor%
  • Fügen Sie das zu Ihrem pointFuncs hinzu, damit lua darüber Bescheid weiß.

    %Vor%
greatwolf 15.08.2013, 22:12
quelle
5

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.

    
Dmitry Ledentsov 15.08.2013 21:15
quelle

Tags und Links