簡體   English   中英

無法從c ++ / lua函數調用成員函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM