2009-05-19 6 views
3

Ich arbeite an einem C++ Projekt mit einer großen Anzahl von Klassen (150+), von denen jede irgendwo zwischen 10 und 300 Felder oder so. Ich würde wirklich gerne in der Lage sein, eine Scripting-Schnittstelle für Testzwecke zur Verfügung zu stellen, damit ich Callbacks programmieren kann, die keine Neukompilierung erfordern. Ich würde das gerne in Lua machen, da ich mit seiner C-API besser vertraut bin als mit Pythons, aber wenn es Kopfschmerzen erspart, würde ich es gerne in Python machen.Pass Variablen zwischen C++ und Lua über Swig

Ich habe ein solides Verständnis, wie man Lua-Funktionen von meinem C++ und umgekehrt aufrufen kann, und ich weiß, wie man grundlegende Datentypen hin und her leitet. Die Frage, die ich habe, ist, wie man benutzerdefinierte Datentypen zwischen den beiden mit SWIG teilen.

Zum Beispiel, an einem bestimmten Punkt in meinem C++, möchte ich vielleicht ein paar Stücke von Mitgliedsdaten in einem Objekt mit 250 Feldern bewerten. Ich würde gerne in der Lage sein, dieses Objekt an Lua zu übergeben, das dann (hoffentlich?) Die generierten SWIG-Wrapper verwenden könnte, um dieses Objekt zu manipulieren, bestimmte Felder anzuzeigen und dann das (möglicherweise geänderte) Objekt zur weiteren Verwendung zurück an C++ zu übergeben .

Ich möchte auch eine Instanz des Objekts in Lua mithilfe der Wrapper instanziieren und es an C++ übergeben können, um als eine normale C++ - Version des Objekts verwendet werden.

Ist das möglich? Könnte mich jemand auf ein Tutorial oder ein explizites Beispiel hinweisen?

Danke für jede Hilfe, die Sie anbieten können!

Antwort

1

Solange Sie Ihre benutzerdefinierten Typen mit Swig-Schnittstellen umschließen (Informationen zur Swig-Lua-API finden Sie unter here), sollte die Interaktion nahtlos erfolgen. Die bereitgestellten Swig-Wrapper ermöglichen es Ihnen, neue Objekte zu instanziieren und sie an C++ und umgekehrt weiterzugeben.

Ich glaube nicht, dass Swig-Lua Wrapping Director-Klassen noch unterstützt, was bedeutet, dass das Existieren vorhandener Klassen, ihre Instanziierung und ihre Rückgabe an C++ nicht möglich ist. Directors werden jedoch für Sprachen wie Python, Java und C# unterstützt.

+0

Das ist großartig, danke für den Link! Sogar nur in eine Richtung zu gehen ist eine große Hilfe. Auch wenn ich keine brandneue Instanz eines Objekts in Lua erstellen und an C++ zurückgeben kann, wissen Sie, ob ich ein vorhandenes C++ - Objekt, das an Lua übergeben wurde, * modifizieren * kann? Das heißt, kann ich ein C++ - Objekt erstellen, es an Lua übergeben, ein paar Felder in Lua ändern und es dann in C++ mit den aktualisierten Feldern wieder verwenden? – zslayton

+0

Ja, natürlich. Das Ändern des Objekts in LUA (über die Schnittstelle, die von SWIG bereitgestellt wird) ändert das zugrundeliegende C++ - Objekt tatsächlich. Es ist alles ziemlich nahtlos. SWIG macht auch einen guten Job mit Sprachfunktionen wie Arrays, STL, Zeigern, Factory-Type-Funktionen und operatorbasierten Klassenschnittstellen (einschließlich Smartpointern) – ASk

0

Wenn swig Ihnen Probleme bereitet, hatte ich viel Glück mit der neuesten Version von tolua ++, die ausschließlich für die Bindung von C++ und Lua gedacht ist. Es erfordert eine modifizierte .h-Datei als Eingabe, was ein wenig mühsam ist, aber nicht mehr als Swigs Module. Ich habe keinen Grund, einen vor dem anderen zu bevorzugen, aber es ist gut, beides zu wissen.

0

Sie sollten auch Luabind überprüfen. Dieser implementiert OOP für Lua und kann Klassen und Datentypen von Lua zurück nach C++ abbilden.