5-25
1. 在C++中类的成员变量被声明为static,该类的所有实例所共享,当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见。
2. 静态函数不需要实例化就可以被调用,不会也不可以调用或操纵非静态成员,总之,从OOA/OOD的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的。静态成员函数的作用基本上相当于:一个带有命名空间的全局函数。静态成员函数主要为了调用方便,不需要生成对象就能调用。
常用静态函数来生成对象实例。
定义类: class SystemInfo { public: static SystemInfo *GetInstance(); }; 定义函数: SystemInfo *SystemInfo::GetInstance() { static SystemInfo sysInfo; return &sysInfo; } 使用1: os_rel = SystemInfo::GetInstance()->GetLinuxReleaseVer(); 使用2: SystemInfo *sys = SystemInfo::GetInstance(); sys->Init();
3. LUA使用 C++调用lua脚本
// HelloLua.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <iostream> using namespace std; // 这是个C++程序, 所以要extern "C", 因为lua的头文件都是C格式的 extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } int main() { lua_State* L; //初始化lua,在5.2版本之前是用lua_open函数,发现这个函数在5.2中已经被遗弃, //被新的函数luaL_newstate和lua_newstate替代。lua_newstate可自定义内存分配函数, //luaL_newstate使用默认的内存分配方式. L = luaL_newstate(); luaopen_base(L); //load Lua base libraries luaL_openlibs(L); //加载1.lua文件,之前的版本luaL_dofile()函数的第二个参数要写绝对路径,否则执行后会提示“unprotected error in call to lua api(attampt to call a nil value)”错误 luaL_dofile(L, "1.lua"); //获取Lua脚本中的函数名 lua_getglobal(L, "add"); //传参,传入第一个参数 lua_pushnumber(L, 3); //传入第二个参数 lua_pushnumber(L, 4); //调用函数:带有2个参数和1个返回值 lua_call(L, 2, 1); //获取调用结果 int sum = (int)lua_tonumber(L, -1); lua_pop(L, 1); cout << "The sum is " << sum << endl; //cleanup Lua lua_close(L); system("pause"); return 0; }
4. 进程守护
除了使用进程守护以外,还可以使用定时任务功能,每隔几分钟执行一下检测脚本来检测任务是否存在。
5. sqlite本地数据库用于存储进程运行过程中获取的需要存储的数据。
SQLite 是一个进程内库,它实现了一个自包含的、 无服务器的、 零配置的、事务性的 SQL 数据库引擎。SQLite数据库由于资源占用少、性能良好和管理成本低,嵌入式数据库。支持ACID事务、零配置―无需安装和管理配置、存储在单一磁盘文件中的一个完整的数据库。SQLite只提供了Btree存储数据的模式。对二进制数据,SQLite不能直接保存;但可以先将二进制的数据转换成ASCII编码,然后再保 存。Base64编码机制是最常见的把二进制数据转换成ASCII编码的手段。
6.