使用C/C++给静态类型数据添加运算符重载功能(二)

2014-11-24 07:38:49 · 作者: · 浏览: 1
a.x=0; //参数不符合要求,返回nil SetRunErr(1,L"char 参数无法识别!",theOperator,0,hFor); return a; } //Lu脚本可调用的二级函数定义 LuData _stdcall lu_int2char(luINT mm,LuData *xx,void *vFor) //将一个整数转换为char { static wchar_t ErrName[]=L"int2char"; LuData a; if(xx->BType==luStaData_int64) { a.BType = luStaData_int64; a.VType = key_char; //设置数据的基本类型和扩展类型 a.x = (char)xx->x; } else //出错时向Lu 系统报告运行错误 { a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0; SetRunErr(1,ErrName,1,0,vFor); } return a; } void main(void) { void *hFor; //存放表达式句柄,即脚本函数句柄 luINT nPara; //存放表达式的自变量个数 LuData *pPara; //存放输入自变量的数组指针 LuData Val; //存放表达式的值 luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置 int ErrCode; //错误代码 wchar_t ForStr[]=L"int2char(800) % int2char(500)"; //字符串表达式 if(!InitLu()) return; //初始化Lu SetFunction(L"int2char",lu_int2char,0); //设置二级函数 LockKey(key_char,Del_char,OpLock_char); //在Lu键树中加锁键,只能存储char类型,但实际上什么也不存储,只为了配合运算符重载 ErrCode=LuCom(ForStr,0,0,0,&hFor,&nPara,&pPara,&ErrBegin,&ErrEnd); //编译表达式 if(ErrCode) { printf("表达式有错误!错误代码: %d \n",ErrCode); } else { Val=LuCal(hFor,pPara); //计算表达式的值,hFor即编译得到的表达式句柄 if(Val.VType==key_char) printf("Lu表达式的值: %I64d \n",Val.x); } printf("C 表达式的值: %d \n",((char)800) % ((char)500)); LockKey(key_char,NULL,OpLock_char); //在Lu键树中解锁键 FreeLu(); //释放Lu }


运行结果:

Lu表达式的值: 8
C 表达式的值: 8

4 函数说明

本例用到了Lu的6个输出函数:初始化Lu的函数InitLu,释放Lu的函数FreeLu,编译表达式的函数LuCom、计算表达式的函数LuCal、加锁键函数LockKey、注册C/C++函数的函数SetFunction。从这里查看这些函数的说明:Lu编程指南。

5 难点分析

在给静态类型数据添加运算符重载功能时,需要:(1)用LockKey加锁一个键(本例为key_char),但不需要向Lu系统注册任何键值;(2)删除键值的函数(本例为Del_char)定义为空函数;(3)定义运算符重载函数(本例为OpLock_char)。

根据函数OpLock_char中定义的运算规则可知,代码中的字符串表达式定义为 "int2char(800) % 500" 或者 "800 % int2char(500)" 有相同的运算结果,很明显,本例较简单,没有实现不同数据类型的自动转换。

6 其他

你可能注意到了,我的联系方式就在下面,如有不明之处或有什么建议,可随时与我进行联系。


版权所有 Lu程序设计 2002-2013,保留所有权利
E-mail: forcal@sina.com QQ:630715621
最近更新: 2014年01月05日