C++ set、ios set get方法法

  在菜鸟教程自学了redis,总想着像Mysql一样,在C/C++中进行对接。于是查询了一些资料,最后找到了hiredis。然而直接用它的话,难免有点不方便。于是,对其进行封装。
  hiredis直接去git上克隆,地址:/redis/hiredis。
  下载好之后,由于其自带Makefile,只要make一下就编译出静态库与动态库了,接着把头文件和静/动态库放在相应的文件夹里就可以了。注意如果使用动态库,而且是放在/usr/local/lib/里,得执行ldconfig命令,来更新一下配置,或者得配置一下动态库路径。
  安装好了就是如何使用的事了。
  学习hiredis主要是参考这两个链接:
  一共就五个函数。
1、redisContext* redisConnect(const char *ip, int port)
2、redisContext* redisConnectWithTimeout(const char *ip, int port, timeval tv)
3、void redisFree(redisContext *c)
4、void *redisCommand(redisContext *c, const char *format...)
5、void freeReplyObject(void *reply)
  和Mysql一样,要对接,第一件事就是用IP和端口号建立连接什么的。redis的端口号一般是6379,IP直接用127.0.0.1就可以了。既然要用到IP和端口号,又是可能会变的东西,为了不使想要改变它们的时候得直接修改代码,我写了个配置文件:
redisConf.json
<span style="color: # {
<span style="color: #
"IP" : "<span style="color: #7.0.0.1" ,
<span style="color: #
"PORT" : <span style="color: #79
<span style="color: # }
  相应地,有提取配置信息的类
redisConf.h
1 #ifndef __REDISCONF_H__
2 #define __REDISCONF_H__
3 #include &string&
4 namespace ccx{
5 using std::string;
6 class RedisConf
RedisConf();
<span style="color: #
void getConf();
<span style="color: #
string getIP();
<span style="color: #
int getPort();
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: # };
<span style="color: # }
<span style="color: # #endif
redisconf.cc
1 #include "redisConf.h"
2 #include &stdlib.h&
3 #include &json/json.h&
4 #include &string&
5 #include &iostream&
6 #include &fstream&
8 namespace ccx{
<span style="color: # using std::
<span style="color: # using std::
<span style="color: # using std::
<span style="color: #
<span style="color: # RedisConf::RedisConf()
<span style="color: # {
<span style="color: #
getConf();
<span style="color: # }
<span style="color: #
<span style="color: # void RedisConf::getConf()
<span style="color: # {
<span style="color: #
<span style="color: #
ifs.open("redisConf.json");
<span style="color: #
if(!ifs.good())
<span style="color: #
<span style="color: #
cout && "open RedisConf.json error" &&
<span style="color: #
exit(EXIT_FAILURE);
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
if(!reader.parse(ifs, root, false))
<span style="color: #
<span style="color: #
cout && "RedisConf json reader error" &&
<span style="color: #
exit(EXIT_FAILURE);
<span style="color: #
<span style="color: #
<span style="color: #
_ip = root["IP"].asString();
<span style="color: #
_port = root["PORT"].asInt();
<span style="color: #
ifs.close();
<span style="color: # }
<span style="color: #
<span style="color: # string RedisConf::getIP()
<span style="color: # {
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # int RedisConf::getPort()
<span style="color: # {
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # }
  然后是目前的redis类:
1 #ifndef __REDIS_H__
2 #define __REDIS_H__
4 #include "redisConf.h"
6 #include &hiredis/hiredis.h&
9 namespace ccx{
<span style="color: #
<span style="color: # class Redis
<span style="color: # {
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
void Connect();
<span style="color: #
void disConnect();
<span style="color: #
<span style="color: #
void setString(const string & key, const string & value);
<span style="color: #
void setString(const string & key, const int & value);
<span style="color: #
void setString(const string & key, const float & value);
<span style="color: #
<span style="color: #
void setString(const string & data);
<span style="color: #
<span style="color: #
void getString(const string & key, string & value);
<span style="color: #
void getString(const string & key, int & value);
<span style="color: #
void getString(const string & key, float & value);
<span style="color: #
<span style="color: #
void getString(const string & key);
<span style="color: #
<span style="color: #
void freeReply();
<span style="color: #
bool isError();
<span style="color: #
<span style="color: #
RedisConf _
<span style="color: #
redisContext * _
<span style="color: #
redisReply * _
<span style="color: # };
<span style="color: # }
<span style="color: #
<span style="color: # #endif
  下面结合写好的代码说说前面的五个函数。
  函数1是用来连接redis的,具体如下:
1 void Redis::Connect()
_context = ::redisConnect(_conf.getIP().c_str(), _conf.getPort());
cout && _conf.getIP() && "-" && _conf.getPort() &&
if(_context && _context-&err)
cout && "connect redis error" &&
exit(EXIT_FAILURE);
<span style="color: #
cout && "redis Connect success" &&
<span style="color: # }
  函数2是在1的基础上,添加了一个超时功能。
  函数3是在不使用redis了,要断开连接时使用的:
<span style="color: # void Redis::disConnect()
<span style="color: # {
<span style="color: #
::redisFree(_context);
<span style="color: #
cout && "redis disConnect success" &&
<span style="color: # }
  函数4稍微复杂一些,有点像C中的printf:
<span style="color: # printf("%d%s%d",d1,s1,d2);
<span style="color: # printf("hello,world");
  可以这样用:
<span style="color: # char * command = "SET name lili";
<span style="color: # reply = (redisReply*)::redisCommand(context, command);
<span style="color: # char * s1 = "name";
<span style="color: # char * s2 = "lili";
<span style="color: # reply = (redisReply*)::redisCommand(context, "SET %s %s", s1, s2);
<span style="color: # reply = (redisReply*)::redisCommand(context, "SET name lili");7 ...
  第一个参数context是函数1或者2的返回值,告诉它要与哪里的redis进行交互。reply指向命令结果的存储位置。
  函数5是用来清理函数4 的返回结果的:
<span style="color: # void Redis::freeReply()
<span style="color: # {
<span style="color: #
if(_reply)
<span style="color: #
<span style="color: #
::freeReplyObject(_reply);
<span style="color: #
_reply = NULL;
<span style="color: #
<span style="color: # }
  第6行是因为对这个函数不熟,就干脆清完之后给它赋值NULL。
  由于redis的string中存的可能是字符串、整形、浮点数,于是各自重载了三个版本的get与set方法,并重用一些函数,以减少代码量。
  对于set,直接用一个宏替换:
<span style="color: # #define SETSTRING(key, value) \
<span style="color: # \
<span style="color: #
ss && "SET " && key && " " &&\
<span style="color: #
<span style="color: #
getline(ss, s);\
<span style="color: #
setString(s);
1 void Redis::setString(const string & key, const string & value)
SETSTRING(key, value);
5 void Redis::setString(const string & key, const int & value)
SETSTRING(key, value);
9 void Redis::setString(const string & key, const float & value)
<span style="color: # {
<span style="color: #
SETSTRING(key, value);
<span style="color: # }
  使用C++中的stringstream,会比用“%d”、“%s”、“%f”来区分类型少些代码。两种方法的结果是相同的。
  它们共用的setString方法:
1 void Redis::setString(const string & data)
freeReply();
_reply = (redisReply*)::redisCommand(_context, data.c_str());
if(!isError())
if (!(_reply-&type == REDIS_REPLY_STATUS && strcasecmp(_reply-&str,"OK") == <span style="color: #))
cout && "Failed to execute SET(string)" &&
<span style="color: #
<span style="color: #
<span style="color: # }
  这里的isError是用来判断是否连接异常的:
1 bool Redis::isError()
if(NULL == _reply)
freeReply();
disConnect();
Connect();
return true;
<span style="color: #
return false;
<span style="color: # }
  如果连接异常,得断开重连。
  在redis命令行里,如果set成功,会提示“OK”。于是,这里先判断了一下命令结果的数据类型,如果是字符串,再判断它是不是“OK”,以此来判断set是否成功。
  对于get,我试了各种方法,都无法直接从命令结果中提取出数字,暂时还没找到原因。但是数字却可以以字符串格式得到。于是,使用了atoi来处理:
1 void Redis::getString(const string & key)
freeReply();
_reply = (redisReply*)::redisCommand(_context, "GET %s", key.c_str());
7 void Redis::getString(const string & key, string & value)
getString(key);
<span style="color: #
if(!isError() && _reply-&type == REDIS_REPLY_STRING)
<span style="color: #
<span style="color: #
value = _reply-&
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # void Redis::getString(const string & key, int & value)
<span style="color: # {
<span style="color: #
getString(key);
<span style="color: #
if(!isError() && _reply-&type == REDIS_REPLY_STRING)
<span style="color: #
<span style="color: #
value = ::atoi(_reply-&str);
<span style="color: #
<span style="color: # }
<span style="color: #
<span style="color: # void Redis::getString(const string & key, float & value)
<span style="color: # {
<span style="color: #
getString(key);
<span style="color: #
if(!isError() && _reply-&type == REDIS_REPLY_STRING)
<span style="color: #
<span style="color: #
value = ::atof(_reply-&str);
<span style="color: #
<span style="color: # }
1 #include "redis.h"
3 #include &string.h&
4 #include &stdlib.h&
6 #include &sstream&
7 #include &iostream&
9 namespace ccx{
11 using std::
12 using std::
13 using std::
15 #define SETSTRING(key, value) \
ss && "SET " && key && " " &&\
getline(ss, s);\
setString(s);
22 Redis::Redis()
23 : _conf()
27 void Redis::Connect()
_context = ::redisConnect(_conf.getIP().c_str(), _conf.getPort());
cout && _conf.getIP() && "-" && _conf.getPort() &&
if(_context && _context-&err)
cout && "connect redis error" &&
exit(EXIT_FAILURE);
cout && "redis Connect success" &&
39 void Redis::disConnect()
::redisFree(_context);
cout && "redis disConnect success" &&
45 void Redis::setString(const string & data)
freeReply();
_reply = (redisReply*)::redisCommand(_context, data.c_str());
if(!isError())
if (!(_reply-&type == REDIS_REPLY_STATUS && strcasecmp(_reply-&str,"OK") == <span style="color: #))
cout && "Failed to execute SET(string)" &&
58 void Redis::setString(const string & key, const string & value)
SETSTRING(key, value);
63 void Redis::setString(const string & key, const int & value)
SETSTRING(key, value);
68 void Redis::setString(const string & key, const float & value)
SETSTRING(key, value);
73 void Redis::getString(const string & key)
freeReply();
_reply = (redisReply*)::redisCommand(_context, "GET %s", key.c_str());
79 void Redis::getString(const string & key, string & value)
getString(key);
if(!isError() && _reply-&type == REDIS_REPLY_STRING)
value = _reply-&
88 void Redis::getString(const string & key, int & value)
getString(key);
if(!isError() && _reply-&type == REDIS_REPLY_STRING)
value = ::atoi(_reply-&str);
97 void Redis::getString(const string & key, float & value)
getString(key);
<span style="color: #0
if(!isError() && _reply-&type == REDIS_REPLY_STRING)
<span style="color: #1
<span style="color: #2
value = ::atof(_reply-&str);
<span style="color: #3
<span style="color: #4 }
<span style="color: #5
<span style="color: #6 void Redis::freeReply()
<span style="color: #7 {
<span style="color: #8
if(_reply)
<span style="color: #9
<span style="color: #0
::freeReplyObject(_reply);
<span style="color: #1
_reply = NULL;
<span style="color: #2
<span style="color: #3 }
<span style="color: #4
<span style="color: #5 bool Redis::isError()
<span style="color: #6 {
<span style="color: #7
if(NULL == _reply)
<span style="color: #8
<span style="color: #9
freeReply();
<span style="color: #0
disConnect();
<span style="color: #1
Connect();
<span style="color: #2
return true;
<span style="color: #3
<span style="color: #4
return false;
<span style="color: #5 }
<span style="color: #6
<span style="color: #7 }
1 #include "redis.h"
3 #include &string&
4 #include &iostream&
6 using std::
7 using std::
8 using std::string;
<span style="color: # int main()
<span style="color: # {
<span style="color: #
<span style="color: #
redis.Connect();
<span style="color: #
redis.setString("name", "lii");
<span style="color: #
<span style="color: #
<span style="color: #
redis.getString("name", s);
<span style="color: #
cout && s &&
<span style="color: #
<span style="color: #
redis.setString("age", "<span style="color: #");
<span style="color: #
redis.getString("age", s);
<span style="color: #
cout && s &&
<span style="color: #
<span style="color: #
<span style="color: #
redis.getString("age", i);
<span style="color: #
cout && i &&
<span style="color: #
<span style="color: #
redis.disConnect();
<span style="color: # }
  测试结果如下:
<span style="color: #7.0.<span style="color: #.1-<span style="color: #79
redis Connect success
<span style="color: #
<span style="color: #
redis disConnect success
阅读(...) 评论()c++ 修改stl set中的元素 - CSDN博客
c++ 修改stl set中的元素
set的迭代器it有const修饰符,那么对它元素的修改就必然不能成功了。但是有时候遇到要修改stl set元素的问题,这个问题一般的解决方法是先erase这个元素,然后再insert,这样效率很低,所以得找更有效的方法,开始的时候编译始终通不过。如果利用const_cast(*it)把it映射成一个引用的对象,那么就可以对它进行修改了。更加通用的方法如下:
#include &set&
#include &string&
#include &iostream&
class CEmployee {
CEmployee();
~CEmployee();
const string getName()
void setName(const string name);
const string getTitle()
void setTitle(string title);
int getID()
void setID(int id);
CEmployee::CEmployee()
CEmployee::~CEmployee()
const string CEmployee::getName() const
void CEmployee::setName(const string username)
m_username =
const string CEmployee::getTitle() const
void CEmployee::setTitle(string title)
int CEmployee::getID() const
void CEmployee::setID(int id)
class sortByID
bool operator() (CEmployee const &_A, CEmployee const &_B) const
if(_A.getID() & _B.getID())
if(_A.getID() == _B.getID()) return _A.getName().compare(_B.getName()) & 0;
int main()
set&CEmployee, sortByID& empIDS // se是雇员的set,
set&CEmployee, sortByID& ::
CEmployee employeeI
employeeInfo.setName(&employee_one&);
employeeInfo.setTitle(&employee&);
employeeInfo.setID(1);
empIDSet.insert(employeeInfo);
CEmployee employeeInfo2;
employeeInfo2.setName(&employee_two&);
employeeInfo2.setTitle(&CFO&);
employeeInfo2.setID(5);
empIDSet.insert(employeeInfo2);
CEmployee employeeInfo3;
employeeInfo3.setName(&employee_three&);
employeeInfo3.setTitle(&manager&);
employeeInfo3.setID(3);
empIDSet.insert(employeeInfo3);
// 第一步:找到要改变的元素
iter = empIDSet.find(employeeInfo2);
if(iter!=empIDSet.end())
// 第二步:拷贝这个元素
CEmployee e(*iter);
// 第三步:删除这个元素;
empIDSet.erase(iter++);
// 自增这个迭代器以保持它有效(参见条款9)
// 第四步:修改这个副本
e.setTitle(&Corporate Deity&);
// 第五步:插入新值;提示它的位置
empIDSet.insert(iter, e);
// 和原先元素的一样
//不起效果
//static_cast&CEmployee&(*iter).setTitle(&Corporate Deity&);
cout&&& Failed/n&&&
for (iter=empIDSet.begin(); iter!=empIDSet.end(); iter++)
cout&&iter-&getID()&&& & &&iter-&getName()&&& & &&iter-&getTitle()&&
本文已收录于以下专栏:
相关文章推荐
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还...
一、问题引入
正如所有标准关联容器,set和multiset保持它们的元素有序,这些容器的正确行为
依赖于它们保持有序。 如果你改了关联容器里的一个元素的值(例如,把10变为1000),新值可能不...
混杂着记录的,可能会比较乱,但是都是一些有用的点
pair insert(const value_type& x);
iterator insert(iterator positi...
set的元素类型和比较函数(或者函数对象)是可以配置的,但是一旦配置就不能更改。set的元素类型不可更改是很自然的,这本就是模板的天然含义。set的比较函数虽然可以得到,但是得到的是copy,不是引用...
set概述和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。
在进行数据删除操作后,迭代器...
C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数...
用Matlab画图时,有时候需要对各种图标进行标注,例如,用“+”代表A的运动情况,“*”代表B的运动情况。legend函数的基本用法是LEGEND(string1,string2,string3, ...
A1127. 方格取数
时间限制:1.0s&#160;&#160; 内存限制:256.0MB&#160;&#160;
总提交次数:327&#160;&#160;
AC次数:124&#160;&#160; 平均分:64.46
将本题分享到:
&#160;&#160;&#...
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时...
1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据。它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序。每个元素的值不能直接被改变。
&#160; &#160; &#160; &#160; 【重点】内部结构...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)get与set方法的宏定义实现
一、文章来由
国庆节依然顽强的码代码,项目中需要用到 get 和 set 方法,但是问题来了,因为是 c++ 的,并不像 java 的 eclipse 有自动生成 get 和 set 方法。
一、文章来由
国庆节依然顽强的码代码,项目中需要用到 get 和 set 方法,但是问题来了,因为是 c++ 的,并不像 java 的 eclipse 有自动生成 get 和 set 方法。如果手写是可以,但是当属性特别多的时候会非常麻烦。。。但是宏定义方法可以搞定这个问题~~
二、具体代码
2.1 非指针类型成员变量
#define PropertyBuilderByName(type, name, access_permission)\
access_permission:\
type m_##\
inline void set##name(type v) {\
m_##name =\
inline type get##name() {\
return m_##\
可以这样写的原因就是因为 #define 预处理,是在编译器编译之前执行的纯字符串替换,这里的 ##name 会直接被替换成传入的 name,所以该宏生成成员变量 m_name 由 name 决定,其访问权限由 acess_permission 指定
`#define语句中的#是把参数字符串化,##是连接两个参数成为一个整体。
2.2 指针类型成员变量
同样的道理:
#define PointerPropertyBuilderByName(type, name, access_permission)\
access_permission:\
type* m_##\
inline void set##name(type* v){\
m_##name =\
inline type* get##name(){\
return m_##\
class Test
PropertyBuilderByName(int, A, private)
PointerPropertyBuilderByName(double, DBV, private)
int main()
t.setA(10);
cout && "A = " && t.getA() &&
double a = 12.3445;
t.setDBV(&a);
cout && "DBV: " && *(t.getDBV()) &&
system("pause");
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
是为多媒体数据提供的转码计算服务。它以经济、弹性和高可扩展的音视频转换方法,将多媒体数据转码成适合在PC、TV以...
阿里云消息服务(Message Service,原MQS)是阿里云商用的消息中间件服务。与传统的消息中间件不同,...
基于云安全大数据能力实现,通过防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
阿里云双11狂欢,不只是5折
Loading...2009年1月 C/C++大版内专家分月排行榜第二
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
2009年1月 C/C++大版内专家分月排行榜第二
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
2009年1月 C/C++大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 java中set和get方法 的文章

 

随机推荐