文档章节

vs2013+lua-5.3.3

半树清风
 半树清风
发布于 2017/09/06 21:14
字数 965
阅读 3
收藏 0

1.C++中学生Student类

①头文件Student.h

复制代码

1 #pragma once
 2 
 3 #include <iostream>
 4 #include <string>
 5 
 6 class Student
 7 {
 8 public:
 9     //构造/析构函数
10     Student();
11     ~Student();
12 
13     //get/set函数
14     std::string get_name();
15     void set_name(std::string name);
16     unsigned get_age();
17     void set_age(unsigned age);
18 
19     //打印函数
20     void print();
21 
22 private:
23     std::string _name;
24     unsigned _age;
25 };

复制代码

②实现文件student.cpp

复制代码

1 #include "Student.h"
 2 
 3 Student::Student()
 4     :_name("Empty"),
 5     _age(0)
 6 {
 7     std::cout << "Student Constructor" << std::endl;
 8 }
 9 
10 Student::~Student()
11 {
12     std::cout << "Student Destructor" << std::endl;
13 }
14 
15 std::string Student::get_name()
16 {
17     return _name;
18 }
19 
20 void Student::set_name(std::string name)
21 {
22     _name = name;
23 }
24 
25 unsigned Student::get_age()
26 {
27     return _age;
28 }
29 
30 void Student::set_age(unsigned age)
31 {
32     _age = age;
33 }
34 
35 void Student::print()
36 {
37     std::cout << "name :" << _name << " age : " << _age << std::endl;
38 }

复制代码

 

2.C++中定义注册全局函数到Lua中

①头文件StudentRegFuncs.h

复制代码

1 #pragma once
 2 
 3 #include "Student.h"
 4 #include "lua.hpp"
 5 
 6 //------定义相关的全局函数------
 7 //创建对象
 8 int lua_create_new_student(lua_State* L);
 9 
10 //get/set函数
11 int lua_get_name(lua_State* L);
12 int lua_set_name(lua_State* L);
13 int lua_get_age(lua_State* L);
14 int lua_set_age(lua_State* L);
15 
16 //打印函数
17 int lua_print(lua_State* L);
18 
19 //------注册全局函数供Lua使用------
20 static const luaL_Reg lua_reg_student_funcs[] = {
21     { "create", lua_create_new_student },
22     { "get_name", lua_get_name },
23     { "set_name", lua_set_name },
24     { "get_age", lua_get_age },
25     { "set_age", lua_set_age },
26     { "print", lua_print },
27     { NULL, NULL },
28 };
29 
30 int luaopen_student_libs(lua_State* L);

复制代码

②实现文件StudentRegFuncs.cpp

复制代码

1 #include "StudentRegFuncs.h"
 2 
 3 int lua_create_new_student(lua_State* L)
 4 {
 5     //创建一个对象指针放到stack里,返回给Lua中使用
 6     Student** s = (Student**)lua_newuserdata(L, sizeof(Student*));
 7     *s = new Student();
 8     return 1;
 9 }
10 
11 int lua_get_name(lua_State* L)
12 {
13     //得到第一个传入的对象参数(在stack最底部)
14     Student** s = (Student**)lua_touserdata(L, 1);
15     luaL_argcheck(L, s != NULL, 1, "invalid user data");
16 
17     //清空stack
18     lua_settop(L, 0);
19 
20     //将数据放入stack中,供Lua使用
21     lua_pushstring(L, (*s)->get_name().c_str());
22 
23     return 1;
24 }
25 
26 int lua_set_name(lua_State* L)
27 {
28     //得到第一个传入的对象参数
29     Student** s = (Student**)lua_touserdata(L, 1);
30     luaL_argcheck(L, s != NULL, 1, "invalid user data");
31 
32     luaL_checktype(L, -1, LUA_TSTRING);
33 
34     std::string name = lua_tostring(L, -1);
35     (*s)->set_name(name);
36 
37     return 0;
38 }
39 
40 int lua_get_age(lua_State* L)
41 {
42     Student** s = (Student**)lua_touserdata(L, 1);
43     luaL_argcheck(L, s != NULL, 1, "invalid user data");
44 
45     lua_pushinteger(L, (*s)->get_age());
46 
47     return 1;
48 }
49 
50 int lua_set_age(lua_State* L)
51 {
52     Student** s = (Student**)lua_touserdata(L, 1);
53     luaL_argcheck(L, s != NULL, 1, "invalid user data");
54 
55     luaL_checktype(L, -1, LUA_TNUMBER);
56 
57     (*s)->set_age((unsigned)lua_tointeger(L, -1));
58 
59     return 0;
60 }
61 
62 int lua_print(lua_State* L)
63 {
64     Student** s = (Student**)lua_touserdata(L, 1);
65     luaL_argcheck(L, s != NULL, 1, "invalid user data");
66 
67     (*s)->print();
68 
69     return 0;
70 }
71 
72 int luaopen_student_libs(lua_State* L)
73 {
74     luaL_newlib(L, lua_reg_student_funcs);
75     return 1;
76 }

复制代码

 

③ C++和Lua之间的交互是通过lua_newuserdata创建出来的内存块进行交互的

LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);

这个函数分配一块指定大小的内存块, 把内存块地址作为一个完全用户数据压栈, 并返回这个地址。 宿主程序可以随意使用这块内存。

 

④注意传入参数的检查宏luaL_argcheck

1 #define luaL_argcheck(L, cond,arg,extramsg)    \
2         ((void)((cond) || luaL_argerror(L, (arg), (extramsg))))

如果cond条件不为true,则抛出一个错误报告调用的 C 函数的第 arg 个参数的问题。

 

⑤类型检查函数luaL_checktype

LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t);

检查函数的第 arg 个参数的类型是否是 t。

 

3.将对应的全局函数注册到Lua中

①加入到注册模块列表中去

复制代码

1 static const luaL_Reg lua_reg_libs[] = {
2     { "base", luaopen_base }, //系统模块
3     { "Student", luaopen_student_libs}, //模块名字Student,注册函数luaopen_student_libs
4     { NULL, NULL }
5 };

复制代码

②注册到Lua中

复制代码

1 //注册让lua使用的库
2 const luaL_Reg* lua_reg = lua_reg_libs;
3 for (; lua_reg->func; ++lua_reg){
4     luaL_requiref(L, lua_reg->name, lua_reg->func, 1);
5     lua_pop(L, 1);
6 }

复制代码

 

4.在Lua中进行调用(Student为模块名)

1 local student_obj = Student.create()
2 Student.set_name(student_obj,"Jack")
3 Student.print(student_obj)

可以看到,调用的方式需要使用模块名,并且第一个参数为创建的对象,和我们熟悉的面向对象的调用方式不一样。

本文转载自:

半树清风
粉丝 0
博文 2
码字总数 900
作品 0
苏州
私信 提问
Linux基础命令---phpMyAdmin

phpMyAdmin 工具 1、检测是否已安装php、php-mysql、apache等工具 [root@localhost src]# rpm -qa |grep php php-cli-5.3.3-26.el6.i686 php-gd-5.3.3-26.el6.i686 php-mysql-5.3.3-26.el6.......

一生有你llx
2018/12/04
0
0
Linux服务器---apache支持php

[b]apache支持php[/b] php是最好用的服务器语言了,Apache对php有很强大的支持 1、检测是否安装php,如果什么信息也没有,那么你就要自己安装php了 [root@localhost ~]# [b]rpm -qa | grep ...

一生有你llx
2018/11/24
0
0
CentOS 6.4 Zabbix 安装

yum和rpm安装zabbix 2.0.9,从2.0.4开始zabbix官方提供了从rpm包和yum仓库安装的方法,近来有空特地参考了官方文档进行了尝试,安装过程记录如下 1、安装zabbix 官方的软件配置仓库包 rpm -i...

小微OA
2013/12/19
2.5K
0
Elasticsearch 5.4.1 和 5.3.3 发布

昨日 Elastic 正式发布针对 5.4 Bug 的修复版本 Elasticsearch 5.4.1(基于 Lucene6.5.1 ),以及基于 Lucene6.4.2的 Elasticsearch 5.3.3。 Elasticsearch 5.4.1 是目前最新的稳定版本,在官...

Medcl
2017/06/02
0
0
Puppy Linux 5.3.3 "Slacko" 发布

Puppy Linux是一个可以直接存放在U盘并启动的微型Linux操作系统。 下载地址: slacko-5.3.3-4g-SCSI.iso (115MB, MD5) slacko-5.3.3-highmem-PAE-SCSI.iso (115MB, MD5). 发行通知: http:/...

红薯
2012/05/05
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

TVS瞬态抑制二极管的三大特点

  TVS管瞬态抑制二极管有以下三大特点。   1、将 TVS 瞬态抑制二极管加在信号及电源线上,能防止微处理器或单片机因瞬间的脉冲,如静电放电效应、交流电源之浪涌及开关电源的噪音所导致的...

仙溪
8分钟前
2
0
6 个 K8s 日志系统建设中的典型问题,你遇到过几个?

导读:随着 K8s 不断更新迭代,使用 K8s 日志系统建设的开发者,逐渐遇到了各种复杂的问题和挑战。本篇文章中,作者结合自己多年经验,分析 K8s 日志系统建设难点,期待为读者提供有益参考。...

Mr_zebra
8分钟前
2
0
准则2.1-性能、运行Wi-Fi在iPad上一个或多个错误问题

很多开发者上架遇到这个问题,苹果那边打不开APP,加载不出来内容! 很多人以为是没有兼容ipad,其实是苹果审核都用ipad,跟有没有支持兼容没有关系。 如果自己在国内测试加载正常,要看APP...

qtb999
8分钟前
3
0
华为云学院带你7天入门Redis(2)

华为云学院带你7天入门Redis(2) 1、深度剖析memory Info是Redis提供的一个非常有用的查看状态信息的命令。使用 redis-cli 连上 Redis,输入 info all 命令,redis-server 就 会返回 Redis ...

华为云学院
16分钟前
4
0
Android 自定义View中,四个参数的构造函数的含义

MyView(Context context) Used when instanciating Views programmatically. MyView(Context context, AttributeSet attrs) Used by the LayoutInflater to apply xml attributes. If one of......

SuShine
18分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部