1. å建Luaå¼æ
ããLuaWrap lua; æè
LuaWrap* lua = new LuaWrap;
ããå建ä¸ä¸ªLuaWrap对象ï¼å°±æ¯å建ä¸ä¸ªLuaèæ¬å¼æã并ä¸æ ¹æ®Luaçç¹æ§ï¼ä½ å¯ä»¥å建任æå¤ä¸ªLuaå¼æï¼çè³å¯ä»¥åå¸å¨ä¸åç线ç¨å½ä¸ã
2. è£
载并æ§è¡èæ¬ç¨åº
ããä½ å¯ä»¥ä»ç¼å²åºä¸è£
è½½Luaèæ¬ï¼
ããlua.LoadString(
ãããã"print('Hello World')"
ãã);
ããå½ç¶ï¼ä½ ä¹å¯ä»¥ä»æ件ä¸è£
å
¥ï¼å¹¶æ§è¡Luaèæ¬ï¼
ããLua.LoadFile("./test.lua");
ããLuaçèæ¬ï¼å¯ä»¥æ¯æºä»£ç ï¼ä¹å¯ä»¥ç»è¿ç¼è¯åçä¸é´ä»£ç ãä¹è®¸ä½ 对ç¼è¯åçä¸é´ä»£ç æ´æå
´è¶£ââå¦æä½ ä¸å¸æ让æºä»£ç 赤裸裸çè¢é²å¨å¤§å®¶çç¼åã
3. è·åå设置Luaåé
ããè½å¤è·åå设置èæ¬åéçå
容ï¼æ¯ä¸ä¸ªæåºæ¬çåè½ãä½ å¯ä»¥ä½¿ç¨GetGlobalåSetGlobalå½æ°æ¥åå°è¿ä¸ç¹ï¼
ãã(1) è·ååéï¼
ããããint a = lua.GetGlobal<int>("a");
ããããLuaTable table = lua.GetGlobal<LuaTable>("t");
ããããè¿éï¼<> é头çç±»åï¼å°±æ¯æ³è¦çåéçç±»åã
ãã(2) 设置åéï¼
ããããlua.SetGlobal("a", a);
ããããlua.SetGlobal("t", table);
4. è°ç¨Luaå½æ°
ãã使ç¨Callå½æ°ï¼å°±å¯ä»¥å¾ç®åçä»ä½ çç¨åºä¸è°ç¨Luaå½æ°ï¼
ããlua.Call<void>("print", "Hello World");
ããint sum = lua.Call<int>("add", 2, 3);
ããè¿éï¼<> é头çç±»åæ¯è¿åå¼çç±»åã
5. å¦ä½è®©Luaä¹è½è°ç¨C++çå½æ°
ããç²¾éçå°æ¹æ¥äºãåå¦æä¸é¢è¿æ ·çä¸ä¸ªå½æ°ï¼
ããint add(int a, int b)
ãã{
ããããreturn a + b;
ãã}
ããå¦ææ³è®©å®è½å¤è®©Lua使ç¨ï¼åªéå°å®æ³¨åå°Luaå¼æå½ä¸å°±å¯ä»¥äºï¼
ããlua.RegisterFunc("add", int(int,int), add);
ããè¿æ ·ï¼Luaä¸å°±å¯ä»¥ç¨ç´æ¥ä½¿ç¨äºï¼
ããï¼Luaèæ¬ï¼sum = add(1, 3)
ãã(*) RegisterFuncçåè½ï¼å°±æ¯è®©ä½ æC++çå½æ°æ³¨åå°Luaä¸ï¼ä¾Luaèæ¬ä½¿ç¨ã
ãããã第ä¸ä¸ªåæ°ï¼æ¯æ³è¦å¨Luaä¸ç¨çå½æ°åã
ãããã第äºä¸ªåæ°ï¼æ¯C++ä¸å½æ°çååï¼ C++å
许å½æ°éè½½çï¼ä½ å¯ä»¥ä½¿ç¨å½æ°ååï¼æ¥éæ©éè¦æ³¨åå°Luaå¼æä¸çé£ä¸ªå½æ°ã
ãããã第ä¸ä¸ªåæ°ï¼å°±æ¯C++ä¸å½æ°çæéäºã
6. å¦ä½è½è®©C++çç±»å¨Luaä¸ä½¿ç¨
ããæ们å
ççä¸é¢è¿ä¸ªC++ç±»ï¼
class MyArray
{
std::vector<double> array;
public:
void setvalue(int index, double value);
double getvalue(int index);
int size();
const char* ToString();
};
ããä½ åå¤è¦è®©Luaè½å¤èªç±è®¿é®å¹¶æä½è¿ä¸ªç±»ãå¾ç®åï¼ä½ åªéå¢å å 个å®å®ä¹å°±å¯ä»¥äºï¼
class MyArray
{
std::vector<double> array;
public:
void setvalue(int index, double value);
double getvalue(int index);
int size();
const char* ToString();
// å°ä¸ä¸ª class ä½ä¸ºä¸ä¸ª Lua 对象æ¯å¾å®¹æçï¼åªéè¦å¢å 以ä¸å®å®ä¹ã
DEFINE_TYPENAME("My.array");
BEGIN_REGLUALIB("array")
LUALIB_ITEM_create("new", MyArray ) // å建MyArray (注ï¼ç±äºå表çåå ï¼createåºä¸ºå
¨é¨å¤§å)
LUALIB_ITEM_DESTROY("del", MyArray ) // æ¶é¤MyArrayã
END_REGLUALIB()
BEGIN_REGLUALIB_MEMBER()
LUALIB_ITEM_FUNC("size", int (MyArray*), &MyArray::size)
LUALIB_ITEM_FUNC("__getindex", double(MyArray*, int), &MyArray::getvalue)
LUALIB_ITEM_FUNC("__newindex", void (MyArray*, int, double), &MyArray::setvalue)
LUALIB_ITEM_FUNC("__tostring", const char* (MyArray*), &MyArray::ToString)
LUALIB_ITEM_DESTROY("__gc", MyArray ) // åå¾æ¶éæ¶æ¶é¤å¯¹è±¡ç¨ã
END_REGLUALIB_MEMBER()
};
ããåªè¦æäºè¿äºå®å®ä¹ï¼è¿ä¸ªç±»å°±æ¯å¯ä»¥å¨Luaä¸ä½¿ç¨çç±»äºï¼æ们就å¯ä»¥å¨Luaä¸æ³¨åè¿ä¸ªç±»äºï¼
ããlua.Register<MyArray>()
ããè¿æ ·æ³¨å以åï¼æ们å¨Luaä¸å°±å¯ä»¥ä½¿ç¨è¿ä¸ªç±»äºï¼
ããa = array.new() -- å建对象ï¼ç¸å½äº a = new Myarray
ããa[1] = 10 -- è°ç¨__newindexï¼ä¹å°±æ¯C++ä¸ç a->setvalue(1, 10)
ããa[2] = 20 -- è°ç¨__newindexï¼ä¹å°±æ¯C++ä¸ç a->setvalue(2, 20)
ããprint(
ããããa, -- è°ç¨ __tostringï¼ä¹å°±æ¯C++ä¸ç a->ToString()
ããããa:size(), -- ç¸å½äºC++ä¸ç a->size()
ããããa[1], -- è°ç¨__getindexï¼ä¹å°±æ¯C++ä¸ça->getvalue(1)
ããããa[2]) --è°ç¨__getindexï¼ä¹å°±æ¯C++ä¸ça->getvalue(2)
ããarray.del(a) -- æ¸
é¤å¯¹è±¡ï¼ç¸å½äº delete a
ããa = nil -- æ¸
空 aï¼å¾è±¡C++ä¸ç a = NULL
ããå½ç¶ï¼ä½ ä¹å¯ä»¥ä¸ç¨delè¿ä¸ªå¯¹è±¡ï¼èæ¯çå¾
Luaå¸®ä½ èªå¨è¿è¡åå¾åæ¶ãå¨Luaè¿è¡åå¾åæ¶æ¶ï¼å®ä¼èªå¨è°ç¨è¿ä¸ªå¯¹è±¡ç __gc ï¼ç¸å½äº deleteã
ããé£ä¹ï¼å¨C++ä¸è¦å建MyArray对象ï¼å¹¶ä¸ä¼ éç»Luaå
¨å±åéæä¹åï¼å°±è±¡åé¢è®²è¿çä¸æ ·ï¼ä½¿ç¨SetGlobalï¼
ããMyArray* a = new MyArray;
ããlua.SetGlobal("a", a);
ããè¦è·å该对象ï¼åæ ·çï¼åºè¯¥ä½¿ç¨GetGlobalï¼
ããMyArray* a = lua.GetGlobal<MyArray>("a");
ãã
ãã对äºä¼ éç»Luaç对象ï¼å°±è®©Luaæ¥ç®¡ç该对象ççåå¨æ好äºãå¦æä½ éè¦å é¤å®çè¯ï¼ä½ å¯ä»¥ä½¿ç¨DelGlobalObjectï¼
ããlua.DelGlobalObject<MyArray>("a");
ããä¸è¿è¿ä¹åçè¯ï¼ä½ åºå½æç½ä½ å¨åä»ä¹ï¼å 为å¨Luaçèæ¬ä¸ï¼å¯è½å·²ç»å¨å¤å¤å¼ç¨äºè¿ä¸ªå¯¹è±¡äºãå é¤äºå
¶ä¸ä¸ä¸ªï¼å°å¯¼è´å
¶å®å¼ç¨å¯¹è±¡å¤±æï¼ä»èå¯è½å¼è´ç³»ç»å´©æºã
ãã(1) DEFINE_TYPENAME("My.array");
ããããå®ä¹ç±»åçå称ãå¨Luaä¸ï¼è¿ä¸ªç±»åå称æ¯å¯ä¸ç¨æ¥è¯å«C++ç±»åçï¼ä½ å¿
须为ä¸åç对象ç»äºä¸åçå称ã
ãã(2) BEGIN_REGLUALIB("array") ⦠END_REGLUALIB()
ããããä½ å¯ä»¥ä¸ºä¸ä¸ªå¯¹è±¡å®ä¹ä¸ä¸ªç¨åºåºï¼"array"å°±æ¯ç¨åºåºçååãå¨ç¨åºåºä¸å®ä¹çå½æ°æ¯å
¨å±å½æ°ï¼å¨Luaä¸ï¼ä½¿ç¨è¯¥å½æ°ï¼éè¦å¨å½æ°åå ä¸åºçååï¼å¦ï¼array.newï¼ï¼ãé常ï¼ç¨åºåºä¼å
å«å建对象çæ¹æ³ãå¦ï¼
ããããLUALIB_ITEM_create("new", MyArray ) // å建MyArray (注ï¼ç±äºå表çåå ï¼createåºä¸ºå
¨é¨å¤§å)
ããããè¿æ ·åï¼ä½ æè½å¨Luaä¸å建MyArrayï¼
ããããa = array.new()
ãã
ããããä½ ä¹å¯ä»¥éæ©å¢å ä¸ä¸ªå é¤å¯¹è±¡æä½ï¼
ããããLUALIB_ITEM_DESTROY("del", MyArray ) // å é¤MyArray
ããããè¿æ ·ï¼ä½ å°±å¯ä»¥ç´æ¥å é¤ä¸ä¸ªå¯¹è±¡äºï¼
ããããarray.del(a)
ãã(3) BEGIN_REGLUALIB_MEMBER() â¦END_REGLUALIB_MEMBER()
ããããå¨æ¤å¤ï¼ä½ å¯ä»¥å®ä¹å¯¹è±¡çæåå½æ°ï¼ä¹å¯ä»¥é载对象çæä½ç¬¦ââæ¯çï¼å°±è±¡C++çoperatoréè½½ãä¾å¦ï¼
ããããLUALIB_ITEM_FUNC("__newindex", void (MyArray*, int, double), &MyArray::setvalue)
ããããå°±æ¯éè½½ operator[] æä½ç¬¦ãLuaä¸å¯éè½½çæä½ç¬¦è¿æ许å¤ï¼å¦ï¼
ãããã__getindexï¼æä½ç¬¦[]ï¼æ¯æ读å访é®ï¼å¦ v = a[10]
ãããã__newindexï¼æä½ç¬¦[]ï¼æ¯æèµå¼è®¿é®ï¼å¦ a[10] = 1.22
ãããã__tostringï¼å°åé转æ¢æå串__addï¼çåäºoperator +
ãããã__addï¼æä½ç¬¦ ï¼
ãããã__subï¼æä½ç¬¦ â
ãããã__mulï¼æä½ç¬¦ Ã
ãããã__divï¼æä½ç¬¦ ÷
ãããã__powï¼æä½ç¬¦ ^ (ä¹æ¹)
ãããã__unmï¼ä¸å
æä½ç¬¦ â
ãããã__concatï¼æä½ç¬¦ .. (å符串è¿æ¥)
ãããã__eqï¼æä½ç¬¦ == (a ~= bçä»·äº not a == b)
ãããã__ltï¼æä½ç¬¦ < (a > b çä»·äº b < a)
ãããã__leï¼æä½ç¬¦ <= (a >= b çä»·äº b <= aï¼è¦æ³¨æçæ¯ï¼å¦æ没æå®ä¹"__le"ï¼åLuaå°ä¼å°è¯å°a<=b 转æ¢æ not (b < a) )
ãããã__gcï¼å¨åå¾åæ¶æ¶è°ç¨æ¤å½æ°ï¼ç¸å½äºC++çææå½æ°ã强ç建议å®ä¹æ¤æä½ç¬¦ï¼ä»¥å
é æå
åæ³æ¼çæ
åµãæ¯å¦ï¼
ããããLUALIB_ITEM_DESTROY("__gc", MyArray ) // åå¾æ¶éæ¶æ¶é¤å¯¹è±¡ç¨ã
ãããã(注) è¿éè¦è¯´æä¸ä¸ï¼å¨luaä¸ï¼è®¿é®ç´¢å¼æä½ç¬¦æ¯__indexï¼ä¸æ¯__getindexï¼å¨luaWrapperåºä¸ï¼ä¸ºäºæ¹ä¾¿ä½¿ç¨ï¼å°å
¶æ å°ä¸º__getindexï¼åæ¶ï¼å¯¹__indexçå®ä¹å°ä¼è¢«å¿½ç¥ã
温馨提示:答案为网友推荐,仅供参考