2009-04-29 6 views
4

Ich möchte zu einer Funktion übergeben, die ein C++ - Objekt einer reinen virtuellen Klasse ein Lua-Objekt einer Klasse erwartet, die von der reinen virtuellen C++ - Klasse abgeleitet ist. Wie kann ich das machen?Eine Funktion erwartet ein C++ - Objekt vom abstrakten Typ A. Wie übertrage ich ein Lua-Objekt einer A-Unterklasse?

Ich bin neu zu Lua und Luabind so mit mir zu tragen.

In C++:

struct A { 
    virtual void foo() = 0; 
}; 

void do_something(A* a) { 
    a->foo(); 
} 

In Lua:

class 'MyA' (A) 
.... 
function MyA:foo() 
    print('hi') 
end 

In C++ wieder:

... // somehow create an instance of MyA class and named myA 
    // How? 
    // Maybe the result of a call to "MyA()"? 

do_something(myA); 
+0

Warum wurde dieser Fragetitel bearbeitet? Der neue Titel ist zu allgemein. – z8000

Antwort

2

Sie würden eine C++ Klasse erstellen, die Ihre rein virtuelle Funktion implementiert, ruft dann den Lua-Code an. Die Implementierung wäre zu kompliziert, um sie hier einzubringen.

Grund Pseudo-Code:

// C++ 
struct LuaA : public A 
{ 
    LuaA(const std::string &luacode) 
    : myLuaHandler(luacode) 
    { 
    } 

    virtual void foo() 
    { 
    myLuaHandler.call("MyA:foo()"); 
    } 
} 

Das Beispiel sehr hohe Niveau ist, aber es ist zu zeigen, bedeutet, dass Sie wollen, was nicht trivial zu tun. Es ist das neue "LuaA", das du eigentlich deinem Lua-Code aussetzen möchtest.

Im Allgemeinen bevorzuge ich SWIG beim Einwickeln meiner C++ für Exposition gegenüber Lua und anderen Skriptsprachen. SWIG unterstützt diese Überladung von virtuellen Methoden, an denen Sie interessiert sind (im SWIG-Sprachgebrauch "Direktoren" genannt), es sollte jedoch angemerkt werden, dass Lua/SWIG keine Direktoren unterstützt. Java, C#, Ruby, Perl und Python haben alle Directors-Unterstützung in SWIG. Ich bin mir nicht sicher, warum es in Lua nicht unterstützt wird.

Es ist möglich, dass, da Lua Vererbung nicht unterstützt, die genaue Semantik dessen, was Sie erreichen möchten, einfach nicht in der Art möglich ist, die Sie vorschlagen.

Vielleicht hat jemand anderes eine bessere Antwort auf die Lua-Seite der Dinge?

+0

Dies ist vergleichbar mit Aarons Lösung unten. Ich denke, das ist wahrscheinlich die Methode, mit der ich gehen werde. Es ist langweilig, aber es wird funktionieren. Vielen Dank! – z8000

2

Siehe Abschnitt 10.1 in der LuaBind-Dokumentation. Sie stellen im Grunde einen einfachen C++ - Wrapper für die LuaBind-Klasse bereit, der als Durchleitung zur zugrunde liegenden Lua-Implementierung fungiert. Beachten Sie die folgenden von diesem doc:

virtual void f(int a) 
{ 
    call<void>("f", a); 
} 

Aufruf ("f", a) wird die Lua 'f' Funktion, rufen Sie eine im Argument übergeben.

+0

Ja, ich habe versucht, dies zu vermeiden, da es ziemlich langweilig ist, aber ich nehme an, sobald es eingerichtet ist, bin ich fertig. OK danke! – z8000

2

Sorry, würde ich keine Antwort auf die Frage, die Sie direkt gefragt haben, aber einen Rat aus eigener Erfahrung bieten statt:

Wenn Sie neue zu Lua sind, sollten Sie ernsthaft in Erwägung ziehen Ihre Schreiben erste Bindungen in Raw Lua API und ohne solche objektorientierten Layout. Zumindest werden Sie verstehen, was wirklich ist geht.

Lua API ist sehr bequem zu verwenden. Es erzeugt keinen zusätzlichen Overhead und Sie haben die volle Kontrolle darüber, was gerade passiert. Die Entwicklung der Luabind-Bibliothek ist im Moment ein bisschen schal (aber es sieht so aus, als ob sie wieder zum Leben erwacht).

Sie sollten überlegen, ob Sie wirklich müssen aus C++ - Klassen in Lua-Seite und vor allem auf C++ - Seite abzuleiten. Eine solche Sache ist für Lua nicht so natürlich und erfordert einen spürbaren Mehraufwand. Außerdem verbergen Sie in C++ die Tatsache, dass Sie einen nicht-nativen Anruf in eine andere Sprache tätigen. Wenn nicht gut dokumentiert, ist dies eine potentielle Quelle für Leistungsprobleme.

Als ich vor ein paar Jahren angefangen habe, mit Lua zu arbeiten, habe ich gewohnt, Bindings genauso zu schreiben wie du, mit Luabind, und imitiert das Ableiten von C++ - Objekten. Jetzt verwende ich reine Lua-API und einfache prozedurale (im Gegensatz zu objektorientierte) sprachübergreifende Schnittstelle. Ich bin viel glücklicher mit dem Ergebnis.

+0

Dies sind definitiv gültige Bedenken. Der Grund für diese Frage ist, dass ich bereits ein klassenbasiertes System (Apache Thrift) verwende und den Service-Handler in Lua anstelle von C++ implementieren möchte. Ich habe versucht, das Muster zu vermeiden, wo ich den Service-Handler in C++ implementieren, und die Methoden davon im Wesentlichen nur anrufen Lua. Ich hatte gehofft, in Lua selbst eine Unterklasse zu machen. Ach, ich denke, ich werde im Wesentlichen eine Mischung aus allen drei bisher veröffentlichten Lösungen (Alexander, Aaron, lefticus) gehen. Danke! – z8000

1

Ich werde die reine virtuelle Klasse in C++ ableiten und dann wahrscheinlich mit luabind beginnen (nach Aaron und lefticus 'Lösungen). Wenn dieser Overhead zu groß ist, werde ich einfach die direkte Lua C Stack-Twiddling-API verwenden (laut Alexander).

Daher gibt es hier keine Antwort. Ich werde später Kommentare mit Ergebnissen veröffentlichen.

Danke allen!