Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //LuaBridge. работа со стеком.
- int main() {lua_State* L = luaL_newstate();
- char x[] = "firts";// массив char.
- string str = "second";
- int a = 30;
- Stack<char const*>::push(L, x);// отправить в стек и получить из стека можно
- Stack<string>::push(L, str);// по char const* и string.
- Stack<int>::push(L, a); // отправить в стек переменную a.
- string y = Stack<string>::get(L, -3); //получить из стека
- cout << y << endl;// выводится firts
- cout << lua_tostring(L, -2) << endl;// выводится second.
- int a1 = Stack<int>::get(L, -1);
- cout << a1 << endl;// выводится 30.
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- lua api c++. Работа со стеком.
- #include<iostream>
- #include"lua/lua.hpp"
- using namespace std;
- //Стек(англ.stack — стопка; читается стэк) — абстрактный тип данных, представляющий собой список элементов,
- //организованных по принципу LIFO(англ.last in — first out, «последний вошёл — первым вышел»)
- int main(int argc, char *argv[]) {
- lua_State *lua = luaL_newstate();/*Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией-*/
- lua_pushnumber(L, 10);// отправить в стек число.
- lua_pushnumber(L, 20);// отправить в стек число.
- lua_pushnumber(L, 30);// отправить в стек число.
- int number = lua_tonumber(L, -3);// получить 10 из стека 1
- cout << number << endl;
- int number2 = lua_tonumber(L, -2);// получить 20 из стека 2
- cout << number2 << endl;
- int number3 = lua_tonumber(L, -1);// получить 30 из стека 3
- cout << number3 << endl;
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- 163 108
- LuaBridge. Получение значения переменных из lua.
- /* Класс LuaRef.
- LuaRef Класс представляет собой контейнер, который ссылается на любой тип Lua. Он может содержать все,
- что может содержать переменная Lua : nil, число, логическое значение, строка, таблица, функция, поток,
- userdata и lightuserdata. Поскольку для выполнения своей работы LuaRef используются Stack шаблоны специализаций,
- классы, функции и данные, экспортируемые в Lua посредством регистрации пространства имен, также могут быть сохранены
- (это экземпляры пользовательских данных). В общем, a LuaRef может представлять любой конвертируемый тип C++, а также все типы Lua.
- */
- int main() {
- lua_State* L = luaL_newstate();
- luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в котором все происходит.
- LuaRef s = getGlobal(L, "x"); // получить значение переменной x в LuaRef.
- // cout << s << endl;
- // int a = s.cast<int>();
- int a1 = s.type();// узнать тип переменной.
- cout <<a1<< endl;
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- lua c++ api. Получение значения переменных из lua с помощью отрицательных индексов стека.
- int main() {int t;
- lua_State *L = luaL_newstate();
- luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
- lua_getglobal(L, "x");// получить значение глобальной переменной x.
- t = lua_type(L, -1);
- if (LUA_TSTRING == t) { cout << "string x " << lua_tostring(L, -1) << endl; }
- else { cout << "not string x " << endl; }
- lua_getglobal(L, "y");// получить значение глобальной переменной x.
- t = lua_type(L, -1);
- if (LUA_TSTRING == t) { cout << "string y " << lua_tostring(L, -1) << endl; }
- else { cout << "not string y " << endl; }
- int n = lua_gettop(L);/* получаем количество элементов в стеке.*/
- cout <<"\nthe number on the stack = " << n<<"\n";
- lua_settop(L, 0);// уст кол-во элементов в стеке. 0 - очистить стек.
- n = lua_gettop(L);/* получаем количество элементов в стеке.*/
- cout << "\nthe number on the stack = " << n << "\n";
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- Lua
- y="i str"
- x=23
- z = true
- LuaBridge. работа с таблицей, вывод ключа и значение, добавление нового.
- void showtab(LuaRef v, lua_State* L) {
- v.push(L); push(L, Nil());// отправить nill на вершину стека.
- while (lua_next(L, -2)) {
- LuaRef key = LuaRef::fromStack(L, -2); // получить из стека и записать в LuaRef.
- LuaRef val = LuaRef::fromStack(L, -1);
- cout << key << " = " << val << endl;
- lua_pop(L, 1);} // Удалить из стека.
- cout << endl;
- }
- int main() {lua_State* L = luaL_newstate();
- luaL_openlibs(L);
- luaL_dofile(L, "main.lua");
- LuaRef t = getGlobal(L, "t");
- if (!t.isTable()) { cout << "error this is nou tab" << endl; }
- else{showtab(t, L);
- t["x"] = 10;
- cout << "after add\n" << endl;
- showtab(t, L); }
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- lua c++ api. функция вывода ключей и значений таблицы.
- int pri(lua_State *L, const char t[] ) {// передаем указатель на состояние.
- lua_getglobal(L, t);// получить значение глобальной переменной, таблица.
- lua_assert(lua_istable(L, -1));// проверить является 1 элемент стека таблицей.
- if (LUA_TTABLE == lua_type(L, -1)) {// это таблица.
- lua_pushnil(L);//кладем на вершину стека NULL
- while (lua_next(L, 1) != 0) {/* получает ключ из стека и отправляет пару ключ - значение из таблицы.
- Ключ имеет - 2, а значение - 1.*/
- if (LUA_TSTRING == lua_type(L, -2)) {// если ключ строка.
- if (LUA_TNUMBER == lua_type(L, -1)) {// значение число.
- cout << "key " << lua_tostring(L, -2) << " value " << lua_tonumber(L, -1) << endl;}
- lua_pop(L, 1);// удалить n элементы из стека.
- }
- }
- }
- return 1;// вернуть 1.
- }
- int main() {
- lua_State *L = luaL_newstate();
- luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
- pri(L,"t");// вывести ключи и значения таблицы.
- lua_pcall(L, 0, 0, 0);// вызов функции в lua файле. 1 параметр кол-во передаваемых, кол-во возвращаемых, обработчик ошибок.
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;}
- lua
- t = {a = "str", b = 11, c = "yes", d =true };
- t1={23,52,75,96}
- LuaBridge. Создание собственного пространства имен, которое представляет таблицу, регистрация переменных.
- int varx = 10;// глоб переменная.
- int vary = 20;// глоб переменная.
- int main() {
- lua_State *L = luaL_newstate();
- luaL_openlibs(L);
- getGlobalNamespace(L).beginNamespace("t")// имя таблицы в в lua.
- .addVariable("x", &varx)// приравнять переменную globalVar к ключю таблицы t.x в lua.
- .addVariable("y", &vary, false) //переменная vary только для чтения.
- .endNamespace();// закрыть пространство имен таблицы.
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- cout << "\nvarx = "<<varx << "\nvary = " <<vary << endl;
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- lua
- print("varx = "..t.x)
- t.x = 999 --globalVar присвовить 999
- --t.y = 16.1110--присвоение запрещено
- print("vary = "..t.y)
- LuaBridge. Пространства имен, регистрация функций.
- string str = "i c++\n";// исходная строка.
- void set(string s) { str = s; }
- string get() { cout << "this is str in func get " << str << endl; return str; }
- int main() {lua_State *L = luaL_newstate();
- luaL_openlibs(L);
- getGlobalNamespace(L).beginNamespace("t")// имя таблицы в в lua.
- .addProperty("set", get, set)// ключ таблицы вызывает функция.
- .addProperty("get", get)// ключ таблицы вызывает функция.
- .endNamespace();// закрыть пространство имен таблицы.
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- lua
- a = t.get -- получить исходную строку.
- print("in lua "..a.."\n")
- t.set = "new string"
- a = t.get-- измененную строку.
- print("in lua "..a.."\n")
- LuaBridge. Регистрация функций.
- void foo() {
- cout << "i func foo\n" << endl;}
- int main() {lua_State* L = luaL_newstate();
- luaL_openlibs(L);
- getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
- .addFunction("foo", foo);// название функции в lua и c++.
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;}
- lua
- foo()
- lua c++ api. Регистрация новой функции в lua.
- int q(lua_State *lua) {// передаем указатель на состояние.
- int x = lua_tonumber(lua, 1); // получаем 1 элемент из стека.
- x = x * x;
- //cout << x << endl;
- lua_pushnumber(lua, x);// умножаем x и отправляет в стек.
- return 1;// вернуть 1.
- }
- int main() {
- lua_State *L = luaL_newstate();
- luaL_openlibs(L);//открыть все стандартные библиотеки lua.
- lua_register(L, "q", q);// регистрируем функцию- имя состояние, имя функ в lua, имя функ тут.
- luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
- lua_pcall(L, 0, 0, 0);// вызов функции в lua файле. 1 параметр кол-во передаваемых, кол-во возвращаемых, обработчик ошибок.
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;}
- lua
- x = q(2)
- print(x)
- LuaBridge. Функция, принимающая аргументы.
- void foo(int x, int y) {
- cout << x+y<<"\n" << endl;}
- int main() {lua_State* L = luaL_newstate();
- luaL_openlibs(L);
- getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
- .addFunction("foo", foo);// название функции в lua и c++.
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;}
- lua
- foo(20,36)
- LuaBridge. функция, возвращающая значение.
- int sum(int x, int y) {
- int sum = x + y;
- cout <<sum <<"\n" << endl;
- return sum;
- }
- int main() {lua_State* L = luaL_newstate();
- luaL_openlibs(L);
- getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
- .addFunction("sum", sum);// название функции в lua и c++.
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;}
- lua
- s=sum(5,5)
- int s; // глобальная переменная для вывода результата функции.
- int sum(int x, int y, lua_State* L) {
- int sum = x + y;
- s = sum; // сохраняем значение sum в переменную s.
- return sum;}
- int main() {lua_State* L = luaL_newstate();
- luaL_openlibs(L);
- getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
- .addFunction("sum", sum);// название функции в lua и c++.
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- cout << s << endl;
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- lua
- s=sum(5,5)
- LuaBridge. Регистрация func функций.
- void writelog(const char x[]) {
- string path = "log.txt";
- fstream f1; {f1.open(path, fstream::in | fstream::out | fstream::app);
- f1 << x << "\n"; }
- f1.close();
- };
- int foo(lua_State* L) {
- try {if (LUA_TNUMBER == lua_type(L, -1)) {// значение число.
- double x = lua_tonumber(L, -1);
- int x2 = (int)x;
- if (x == x2) { cout << x2 << endl; }// int
- else { throw "bad argument in function"; }
- }
- else{throw "bad argument in function"; }
- }
- catch (const char* x) {
- writelog(x);}
- return 0;
- }
- int main() {
- lua_State* L = luaL_newstate();
- luaL_openlibs(L);
- getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
- .addCFunction("foo", foo);// название функции в lua и c++.
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- Lua
- foo(5)
- api lua c++. Структура конструктор по умолчанию.
- struct a { int x = 30;
- a() { this->x = x; }//конструктор по умолчанию
- void show() { cout << "x = " << x << endl; }
- ~a() { cout << "destory object " << this << endl << endl; }
- };
- int destroy(lua_State* L) {// Функция вызывает деструктор для объекта.
- a* st = (a*)lua_touserdata(L, -1);/* Если значение в данном приемлемом индексе является полными данными пользователя.*/
- st->~a();//вызов метода деструктор.
- return 0;};
- int create(lua_State* L) {//Функция создания объекта структуры.
- void* st = lua_newuserdata(L, sizeof(a));/*Эта функция выделяет новый блок памяти с заданным размером,*/
- new (st) a();// Выделить память под польз. данные.
- luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
- lua_setmetatable(L, 1);//получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
- return 1;};
- int show(lua_State* L) {
- a* st = (a*)lua_touserdata(L, -1);// получаем польз. данные.
- st->show();// вызов метода.
- return 0;};
- int main() {
- lua_State* L = luaL_newstate();
- lua_newtable(L);
- lua_pushcfunction(L, create);//уст указатель на функцию C++ и создает внутри Lua
- lua_setglobal(L, "get"); //получает значение из стека и уст значение global name.
- lua_pushcfunction(L, show);
- lua_setglobal(L, "show"); //получает значение из стека и уст значение global name.
- luaL_newmetatable(L, "mt");/*int luaL_newmetatable (lua_State * L, const char * t); */
- lua_pushstring(L, "__gc");
- lua_pushcfunction(L, destroy);
- lua_settable(L, 2);
- luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;}
- lua
- a= get()
- show(a)
- LuaBridge. Реализация ОПП. Создание класса.
- Объект зарегистрированного класса T может быть передан Lua как:
- T Передано по значению (копия), со временем жизни Lua.
- T const Передано по значению (копия), со временем жизни Lua.
- T* Передано по ссылке, со временем жизни C ++ .
- T& Передано по ссылке, со временем жизни C ++ .
- T const* Передается по константной ссылке, со временем жизни C ++ .
- T const& Передается по константной ссылке, со временем жизни C ++ .
- struct a {int x = 10;
- a() { this->x = x; cout <<"create object " << this << "\ncall default constructor\n" << endl; }
- void set(int x) {
- this->x = x; }
- void show() const {/* время жизни lua.*/
- cout << "x = " << x << endl; }
- ~a() { cout << "destory object " << this << endl; }//вызов деструктора.
- };
- int main() {
- lua_State *L = luaL_newstate();
- luaL_openlibs(L);
- luabridge::getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
- .beginClass<a>("st")//имя класса в c++ и lua.
- .addConstructor<void(*)()>()// вызов конструктора по умолчанию.
- .addFunction("show", &a::show)// вызов метода get.
- .addFunction("set", &a::set)// вызов метода set.
- .endClass();// закрыть пространство создание класса
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- Lua
- p = st()
- p:show()
- p:set(42)
- p:show()
- p1 = st()
- p1:show()
- p1:set(100)
- p1:show()
- LuaBridge. Вызов конструктора c параметром.
- struct a {int x;
- a(int x) { this->x = x; cout <<"create object " << this << "\ncall constructor with parameters\n\n"; }
- void set(int x) {
- this->x = x; }
- void show() const {/* время жизни lua.*/
- cout << "x = " << x << endl; }
- ~a() { cout << "destory object " << this << endl; }//вызов деструктора.
- };
- int main() {
- lua_State *L = luaL_newstate();
- luaL_openlibs(L);
- luabridge::getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
- .beginClass<a>("st")//имя класса в c++ и lua.
- .addConstructor<void(*)(int)>()// вызов конструктора c параметром.
- .addFunction("show", &a::show)// вызов метода get.
- .addFunction("set", &a::set)// вызов метода set.
- .endClass();// закрыть пространство создание класса
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- Lua
- p = st(23)
- p:show()
- p:set(42)
- p:show(36)
- p1 = st(76)
- p1:show()
- p1:set(100)
- p1:show()
- api lua. ООП.
- struct a{int x=0;
- a() : x() { cout <<"create object "<< this << endl; }//конструктор по умолчанию
- void set(int x){this->x = x;}//уст значение x.
- void show() {cout << "object - " << this << " x = " << x << endl;}
- //вывести значение x на экран.
- ~a() {cout <<"destory object "<< this << endl; }//вызов деструктора.
- };
- int create(lua_State* L){// Функция создания объекта структуры.
- void* pointerToAa = lua_newuserdata(L, sizeof(a));/*Эта функция выделяет новый блок памяти с заданным размером,
- помещает в стек новые полные пользовательские данные с адресом блока и возвращает этот адрес. Пользовательские данные
- представляют значения C в Lua. Полный UserData представляет собой блок памяти. Это объект (например, таблица):
- вы должны создать его, у него может быть свой собственный метатабль, и вы можете определить, когда он собирается.
- Полные пользовательские данные равны только себе (при необработанном равенстве). Когда Lua собирает полные данные
- пользователя с gcметаметодом, Lua вызывает метаметод и помечает данные пользователя как завершенные.
- Когда эти пользовательские данные собираются снова, Lua освобождает соответствующую память.*/
- new (pointerToAa) a();// Выделить память под польз. данные.
- luaL_getmetatable(L, "aMetaTable"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.
- Если индекс не является действительным, или если значение не имеет метатаблицы, функция возвращает 0 и не отправляет ничего в стеке.*/
- lua_assert(lua_istable(L, 2));//ловит исключения если ли условия ложное.
- lua_setmetatable(L, 1);//получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
- return 1;
- };
- int destroy(lua_State* L){// Функция вызывает деструктор для объекта.
- a* st = (a*)lua_touserdata(L, 1);/* Если значение в данном приемлемом индексе является полными данными пользователя,
- возвращает адрес его блока. Если значение является легким userdata, возвращает его указатель.В противном случае возвращается NULL.*/
- st->~a();//вызов метода деструктор.
- return 0;};
- int set(lua_State* L){
- a* st = (a*)lua_touserdata(L, 1);
- lua_Number x = lua_tonumber(L, 2);
- st->set((int)x);
- return 0;};
- int show(lua_State* L){
- a* st = (a*)lua_touserdata(L, 1);
- st->show();
- return 0;};
- int index(lua_State* L){
- lua_assert(lua_isuserdata(L, 1));
- lua_assert(lua_isstring(L, 2));
- a* st = (a*)lua_touserdata(L, 1);
- const char* index = lua_tostring(L, 2);
- if (strcmp(index, "x") == 0){
- lua_pushnumber(L, st->x);
- return 1; }
- else{lua_getglobal(L, "a");
- lua_pushstring(L, index);
- lua_rawget(L, 3);// Аналогично lua_settable, но делает необработанное назначение(т.Е.Без метаметодов).
- return 1; }
- };
- int newindex(lua_State* L){
- lua_assert(lua_isuserdata(L, -3));
- lua_assert(lua_isstring(L, -2));//
- a* st = (a*)lua_touserdata(L, -3);
- const char* index = lua_tostring(L, -2);
- if (strcmp(index, "x") == 0){
- st->x = (int)lua_tonumber(L, -1); }
- else{lua_assert(false); }
- return 0;
- };
- int main() {
- lua_State* L = luaL_newstate();
- lua_newtable(L);
- int stTableIdx = lua_gettop(L);
- lua_pushvalue(L, stTableIdx);// отправляет копию элемента с заданным допустимым индексом в стек.
- lua_setglobal(L, "a");// Установить значение глобальной переменной.
- lua_pushcfunction(L, create);/* отправляет функцию C в стек. функция получает указатель на функцию C и отправляет в стек
- значение типа Lua, function которое при вызове вызывает соответствующую функцию C. Любая функция, которая должна быть
- зарегистрирована в Lua, должна следовать правильному протоколу, чтобы получать свои параметры и возвращать свои результаты*/
- lua_setfield(L, 1, "new");/*(lua_State * L, int index, const char * k); Соответствует ли t[k] = v, где t значение данного
- заданного допустимого индекса и vзначение в верхней части стека. Эта функция извлекает значение из стека. Как и в Lua,
- эта функция может запускать метаметод для события «newindex» (см. §2.8 ). уст ключ для new. */
- lua_pushcfunction(L, set);
- lua_setfield(L, 1, "set");
- lua_pushcfunction(L, show);
- lua_setfield(L, 1, "show");
- luaL_newmetatable(L, "aMetaTable");/*int luaL_newmetatable (lua_State * L, const char * t); Если в реестре уже есть ключ t,
- возвращает 0. В противном случае создает новую таблицу, которая будет использоваться в качестве метатаблицы
- для пользовательских данных, добавляет ее в реестр с ключом tnameи возвращает 1. В обоих случаях помещает в стек
- окончательное значение, связанное с t реестром.*/
- lua_pushstring(L, "__gc");
- lua_pushcfunction(L, destroy);
- lua_settable(L, 2);
- lua_pushstring(L, "__index");
- lua_pushcfunction(L, index);
- lua_settable(L, 2);
- lua_pushstring(L, "__newindex");
- lua_pushcfunction(L, newindex);
- lua_settable(L, 2);
- int x = luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
- if (x == LUA_OK) { lua_close(L);// если поллучилось открыть файл.
- cin.get();}//ожидает ввода символа программа завершается.
- else { cout << "Error: "<<lua_tostring(L, -1)<<endl;
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0; }
- }
- Lua
- st = a.new()
- --st:show()
- st:set(100)
- st:show()
- st1 = a.new()
- st1:set(200)
- st1:show()
- api lua. Реализация ООП через функции. Структура, конструктор с парамертами.
- struct a { int x = 3010;
- a() { this->x = x; }//конструктор по умолчанию
- void show() { cout << "x = " << x << endl; }
- };
- int create(lua_State* L) {// Функция создания объекта структуры.
- void* st = lua_newuserdata(L, sizeof(a));/*Эта функция выделяет новый блок памяти с заданным размером,*/
- new (st) a();// Выделить память под польз. данные.
- luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
- lua_setmetatable(L, 1);//получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
- return 1;};
- int destroy(lua_State* L) {// Функция вызывает деструктор для объекта.
- a* st = (a*)lua_touserdata(L, 1);/* Если значение в данном приемлемом индексе является полными данными пользователя.*/
- st->~a();//вызов метода деструктор.
- return 0;};
- int show(lua_State* L) {
- a* st = (a*)lua_touserdata(L, -1);
- st->show();
- return 0;};
- int main() {
- lua_State* L = luaL_newstate();
- lua_newtable(L);
- lua_pushcfunction(L, create);//уст указатель на функцию C++ и создает внутри Lua
- lua_setglobal(L, "get"); //получает значение из стека и уст значение global name.
- lua_pushcfunction(L, show);
- lua_setglobal(L, "show"); //получает значение из стека и уст значение global name.
- luaL_newmetatable(L, "mt");/*int luaL_newmetatable (lua_State * L, const char * t); */
- lua_pushstring(L, "__gc");
- lua_pushcfunction(L, destroy);
- lua_settable(L, 2);
- luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- Lua
- a = get()
- show(a)
- lua api
- struct a { int x = 3010;
- a() { this->x = x; }//конструктор по умолчанию
- void show() { cout << "x = " << x << endl; }
- };
- int create(lua_State* L) {// Функция создания объекта структуры.
- void* st = lua_newuserdata(L, sizeof(a));/*Эта функция выделяет новый блок памяти с заданным размером,*/
- new (st) a();// Выделить память под польз. данные.
- luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
- lua_setmetatable(L, 1);//получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
- return 1;};
- int destroy(lua_State* L) {// Функция вызывает деструктор для объекта.
- a* st = (a*)lua_touserdata(L, 1);/* Если значение в данном приемлемом индексе является полными данными пользователя.*/
- st->~a();//вызов метода деструктор.
- return 0;};
- int show(lua_State* L) {
- a* st = (a*)lua_touserdata(L, -1);
- st->show();
- return 0;};
- int main() {
- lua_State* L = luaL_newstate();
- lua_newtable(L);
- lua_pushcfunction(L, create);//уст указатель на функцию C++ и создает внутри Lua
- lua_setglobal(L, "get"); //получает значение из стека и уст значение global name.
- lua_pushcfunction(L, show);
- lua_setglobal(L, "show"); //получает значение из стека и уст значение global name.
- luaL_newmetatable(L, "mt");/*int luaL_newmetatable (lua_State * L, const char * t); */
- lua_pushstring(L, "__gc");
- lua_pushcfunction(L, destroy);
- lua_settable(L, 2);
- luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- Lua
- a = get()
- show(a)
- luabridge. Реализация ООП через функции. Структура, конструктор с парамертами.
- struct a {
- int x = 302;
- a(int x) { this->x = x; cout << "call constructor with parameters\n" << endl; }
- void get() const /* время жизни lua.*/ { cout << x << " " << endl; }
- ~a() { cout << "desctor " << this << endl; }
- };
- void pri(lua_State* L) {
- a *b = (a*)Userdata::get<a>(L, 1, false);
- b->get();// вызов метода переданного класса
- }
- int main() {
- lua_State *L = luaL_newstate();
- luaL_openlibs(L); getGlobalNamespace(L)// получить глоб место.
- .beginClass<a>("st")// имя класса в lua.
- .addConstructor<void(*)(int)>()// конструктор класса.
- .addFunction("get", &a::get)// метод класса
- .endClass()// закрыть регистрацию класса.
- .addFunction("pri", &pri);// Регистрация функции.
- luaL_dofile(L, "main.lua");
- lua_pcall(L, 0, 0, 0);
- lua_close(L);// закрыть состояние
- cin.get();//ожидает ввода символа программа завершается.
- return 0;
- }
- lua
- a=st(21)
- pri(a)
- a1=st(21)
- pri(a1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement