通过地址偏移量访问C++结构体数据成员
2011-08-28 18:34
246 查看
通过偏移量访问成员变量配合C++模板函数。客户代码可以很方便的修改内存对象的数据,不需获取整个对象就可以灵活修改任一属性,相比先获取整个对象修改其中的属性再将整个对象替换的方式提高了效率。
示例代码:
示例代码:
#include "stdafx.h" #include <string> #include <list> #include <map> //获取结构体偏移量宏定义 #define GetAttrOffSet(CLASSTYPE, Attr) (size_t)(&((CLASSTYPE*)0x000)->Attr) //内存模型对象 class CNode { public: int m_iAttrOne; std::string m_strAttrTwo; std::list<int> m_lstAttrThree; std::map<int, std::list<int> > m_mapAttrFour; }; //对象管理器 class CNodeMgr { public: template<class Type> void ModifyNodeAttr(const Type& attr, const int iNodeID, const size_t offset) { //此处略去m_mapNode中找不到iNodeID的异常情况处理 *((Type*)((size_t)m_mapNode[iNodeID] + offset)) = attr; } template<class Type> const Type& GetNodeAttr(const int iNodeID, const size_t offset) { //此处略去m_mapNode中找不到iNodeID的异常情况处理 return *((Type*)((size_t)m_mapNode[iNodeID] + offset)); } CNodeMgr() { m_mapNode[1] = new CNode; m_mapNode[2] = new CNode; m_mapNode[3] = new CNode; } private: std::map<int, CNode*> m_mapNode; }; int _tmain(int argc, _TCHAR* argv[]) { //修改Key值为2的Node对象属性 CNodeMgr nodeMgr; nodeMgr.ModifyNodeAttr((int)1, 2, GetAttrOffSet(CNode, m_iAttrOne)); nodeMgr.ModifyNodeAttr(std::string("abc"), 2, GetAttrOffSet(CNode, m_strAttrTwo)); std::list<int> lstAttr; lstAttr.push_back(1); lstAttr.push_back(2); lstAttr.push_back(3); nodeMgr.ModifyNodeAttr(lstAttr, 2, GetAttrOffSet(CNode, m_lstAttrThree)); std::map<int, std::list<int> > mapAttr; mapAttr[1] = lstAttr; mapAttr[2] = lstAttr; nodeMgr.ModifyNodeAttr(mapAttr, 2, GetAttrOffSet(CNode, m_mapAttrFour)); //获取Key值为2的Node属性 lstAttr = nodeMgr.GetNodeAttr<std::list<int>>(2, GetAttrOffSet(CNode, m_lstAttrThree)); return 0; }
相关文章推荐
- 通过偏移量来访问C++类数据成员实验
- 通过操作地址的方法来访问C++类对象中私有成员变量
- 通过指针访问类的静态数据成员
- 通过this指针访问数据成员
- C/C++—— 除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量
- iphone 自定义uiTableViewCell,如何通过其数据成员来访问cell本身
- 通过指针访问堆中的数据成员
- c++通过存储过程访问数据库库(ado)
- Item 1: 尽可能的使用属性代替可访问的数据成员(Always Use Properties Instead of Accessible Data Members)
- c# POST和GET方式通过server地址提交数据
- 通过外部指针可以访问类的私有成员
- 3第一周课后练习·阅读计划(3)-使用函数来访问私有数据成员
- 记一个oracle官网下的数据类型页访问地址
- 类的数据成员(非指针)的地址在类对象被释放后会怎样?
- Hadoop通过url地址访问HDFS
- 【C#高效编程50例】条目1:使用属性而不是可访问的数据成员
- 为何要通过公有接口来访问私有成员(2)
- C#如何通过匿名类直接使用访问JSON数据详解
- ASP.NET MVC 5 学习教程:通过控制器访问模型的数据
- 通过jsonp来实现跨域访问获取数据!!!