2013-09-24 25 views
2

考慮使用LuaBridge對象傳遞到LUA腳本的下面的例子中的對象:不能修改傳遞給LUA

​​

顯然,傳遞的變量不能由LUA修改:

Core.t1.d = 12 
print(Core.t1.d) 

以上代碼打印10

同樣在處理腳本後的C++中,變量仍然保持其初始值。

luaL_dofile(lua_state, ".../test.lua"); 

std::cout << t1.d << std::endl; // 10 

未對象成員然而簡單的標量數據類型(如浮法)可以進行修改。我錯過了什麼嗎?


編輯: 如果我Test *t1 = new Test(10);甚至Test t(10); Test *t1 = &t;仍然&t1到addVariable取代Test t1(10);這顯然是可以修改的。我真的不明白這種行爲,有人可以解釋嗎? (地址的地址?)

回答

0

LuaBridge複製了你的論點。如果你定義一個拷貝構造函數自己放一個斷點,你會從

/** 
    Push T via copy construction from U. 
*/ 
template <class U> 
static inline void push (lua_State* const L, U const& u) 

跳這僅僅是一個在LuaBridge傳遞參數的合同。我想,它是這樣的,因爲基準具有C++管理的生命週期,並且這是一個安全功能。您可以用新值重寫你的數據,你會得到你想要的東西:

Core.t1.d = 12 
t2 = Core.Test(10) 
t2.d=12 
print(Core.t1.d) 
print(t2.d) 
Core.t1 = t2 
print(Core.t1.d) 

輸出

10 
12 
12 

和你的C++ - 一邊T1將有12

+0

的d值感謝您的回答,這意味着我完全無法在使用LuaBridge從C++公開的對象上使用修改方法? – Appleshell

+0

你應該把你的全局變量的修改包裝到一個函數中。當然你可以做到,但不是那樣。最簡單但不是最安全的方法是'Test t1_(10);測試* t1 = &t1_;' –

+0

這就是我嘗試過的方法。然而,修改方法的意思是'類Test'中的'increment'方法。從lua調用該方法對該對象也沒有影響。 – Appleshell