[英]Can't call member function from c++/lua function
我一直在嘗試使用lua和c ++一段時間,並且所有“簡單”功能都可以工作,即可以從lua調用c ++函數,反之亦然,但是我有一個主要問題。
它正在制作一個小型的游戲/模擬器,我想使用lua,ode並制作我自己的小界面(不是像LuaOde這樣的直接界面)。 我的代碼結構如下
main class //creates instances of Visual, Physics and LuaAddons
v = new Visual();
p = new Physics();
l = new LuaAddons();
現在我當然想和LuaAddons的物理學談談。 所以在LuaAddons.cpp我有:
int setWorldGravity(lua_State* L){
float x = luaL_checknumber(L, 1);
float y = luaL_checknumber(L, 2);
float z = luaL_checknumber(L, 3);
//Here I need to somehow talk to p (Physics())
return 0;
}
這樣我就可以簡單地在我的.lua文件中調用setWorldGravity(1, 2, 3)
,並通過正確的參數調用上面的函數。
這是問題所在。 在int setWorldGravity
里面,我想調用應用程序的物理部分並調用具有ODE調用的corrosponding函數來設置重力。
所以在Physics.h我有:
void setWorldGravity(float x, float y, float z);
使用這些參數調用正確的ODE函數:
void Physics::setWorldGravity( float x, float y, float z ){
dWorldSetGravity (world_, x, y, z);
}
world_
是由主要班級首次發起時創造的世界。
然而,由於int setWorldGravity(lua_State* L)
的int setWorldGravity(lua_State* L)
不是該類的成員(即未在LuaAddons.h中定義,如果它將不得不是靜態的)我不能為我的生活弄清楚如何接近奇異的實例Physics(); 從函數本身。 顯然,我不能讓LuaAddons創建一個新的物理實例,因為它不會有相同的世界。
我試過的是:
l = new LuaAddons(p);
在哪里(在LuaAddons.h中)
LuaAddons(Physics* p);
和(在LuaAddons.cpp中)
LuaAddons(Physics* p){
phys_ = p; // where phys_ is a private member of LuaAddons.h
}
但是,當我嘗試添加
phys_->setWorldGravity(x, y, z); // error C2065: 'phys_' : undeclared identifier
它不起作用,因為(大驚喜)該函數不了解phys_。
我也嘗試過使用Lunar.h庫。 有了這個,我可以將lua函數重塑為一個成員函數,在.h中聲明它並實際調用phys _-> stuff。 但是,庫也會強制您在.lua中創建一個新的調用者實例(mind boggles)來調用其成員:
la_ = LuaAddons()
la_:setWorldGravity(1, 2, 3)
但是這樣,物理部分的鏈接就消失了,因為默認構造函數沒有將指針傳遞給它。 一旦這個調用通過對象並到達它應用於ODE的部分,它就會崩潰(假設空指針或......指針錯誤:P)
如果我真的想要確保操作完全相同的物理世界,我會猜測我幾乎被迫通過lua文件傳遞物理指針。 但我沒有絲毫想法。
對於長時間閱讀我感到很遺憾,但我寧願徹底閱讀,然后遺漏重要細節。
任何幫助/想法將非常感激。
在C ++中,成員函數本質上是具有隱藏參數的函數。 你寫:
class Foo {
const int bar_;
public:
Foo(int b) : bar_ { }
int get_bar()
{
return bar_;
}
};
Foo f(5);
f.get_bar();
但是,實際上,你實際得到:
Foo f = Foo_constructor(5);
Foo_get_bar(f);
在C ++中,這個隱藏的參數稱為this
指針(在Python中它是self
,其他語言有其他名稱)。
聽起來你想要的是一個類似C的函數,它將調用C ++成員函數,傳遞該隱藏參數。 最簡單的解決方案是編寫一個C函數,它接受成員函數所需的所有參數,以及一個額外的參數:調用函數的對象:
void setWorldGravityWrapper(Physics* p, int x, int y, int z)
{
return p->setWorldGravity(x, y, z);
}
還有其他技術(想到成員函數的指針),但這應該讓你開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.