私はかつてluaのクラスメソッドをオーバーライドできると思ったので、C++でその関数を呼び出すと、luaでオーバーライドされたことが行われるようになりました。私はこのように、意味:luaのC++メソッドをオーバーライドしてC++で呼び戻す
C++クラス
class Person {
public:
Person(); // ctr
virtual void shout(); // Meant to be overriden
};
はLUAで、私はオブジェクトを使用できるように、私は、そのクラスは、LUAにバインドされていると仮定します
--Lua code
p = Person:new()
p:shout()
何が実現しようとしているのは次のようなものです:
ルアファイル
--luafile.lua
p = Person:new() --instantiate
--override shout()
p.shout = function(self) print("OVERRIDEN!") end
C++コード上記のコードで
int main() {
lua_State* l = lua_open();
luaL_loadlibs(l);
bind_person_class(l);
luaL_dofile("luafile.lua");
Person* p = (Person*) get_userdata_in_global(l, "p"); // get the created person in lua
p->shout(); // expecting "OVERRIDEN" to be printed on screen
lua_close(l);
return 0;
}
、あなたは私がLUAで人のメソッドをオーバーライドし、オーバーライドメソッドは、C++から呼び出されることを期待しようとしていることがわかります。しかし、私が試してみると、オーバーライドされたメソッドは実行されません。私が達成しようとしているのは、overridenメソッドがC++で実行されることです。どのようにこれを達成するのですか?
===================
私はこれを達成するための方法を考えたが、私はこれが良いかはわかりません。私の考えは、エクスポートされたクラスは、このクラスのインスタンスを保持するために使用されるluaのグローバル変数名を表す文字列を持つ必要があります。
class Person {
public:
Person();
string luaVarName; // lua's global variable to hold this class
virtual void shout() {
luaL_dostring(luaVarName + ":shoutScript()"); // now shout will call shoutScript() in lua
}
};
ので、LUAでは、オブジェクトがshoutScript()を実装し、オブジェクトへのグローバルVAR割り当てること責任がある:このように上記のコードで
--LUA
p = Person:new()
p.shoutScript = function(self) print("OVERRIDEN") end
p.luaVarName = "p"
を、私は私が望むものを達成することができます(避難所しかし、それをテストしていない)。しかし、には、私が望むものを達成するための他の適切な方法がありますか?
最初のパターンが失敗する理由を理解していますか? – GManNickG
@GMan:私は本当にメソッドをオーバーライドしていないと思います。 AFAIK、C ++でメソッド(または関数)を呼び出すと、命令が配置されているアドレスを参照しています。また、関数がオーバーライドされたときに別のアドレスを参照する仕組みがあります。ですから、LUAでそれを "オーバーライド"すると、C++はそれについて知りませんので、実際の関数が呼び出されます。 CMIIW。 – Radi