VC结构体实现类似数组的下标操作符功能
2014-02-13 19:08
741 查看
在某些特殊时候,我们会想如果结构体也能向数组一样通过下标操作符进行操作的话,代码将直接通过循环语句就能实现,尤其当我们的数据来源于数据库获得的数据集时,这种用法还是比较有意思的。
结构体的下标操作这里只做技术上研究,实际开发中非常不提倡这么用。原因是这种结构体当成员很多时结构体占用内存将会非常大(结构体SIZE=MAX(成员SIZE)*成员数),而当结构体成员很少时完全没有必要用下标操作符。这种结构体的下标操作符在实际开发应用中,几乎是没有可用价值的。
要实现结构体的下标操作符,我们需要了解,我们所设定的结构体的成员大小必须有规律,那我们直接假设各成员的内存大小是相等的,就比较简单了。怎么样才能使结构体的成员内存大小都一样,而且我们还要使结构体支持不同类型的成员?这时就可以想到共同体union了,共同体的好处是各成员共享内存。
按这个思路,我们首先将我们需要的类似通过共同体自定义一种新的统一类型:
以上我定义了一个新类型MYVAR,支持字符串、整形和浮点型。然后我们就可以用该新类型进行结构体的定义了:
以上机构体就是每个成员存储的内存大小相等的。这时候就可以通过重载下标操作符的方法,实现下标操作符功能,思路是通过成员地址偏移来寻址成员,新的结构体如下:
这样一来,假设有一个结构体对象
MYDATA data;
那么我们就可以直接通过下标来操作结构体成员了,例如data[0],data[1],data[2]的形式。
我编写了完整的测试代码如下:
以上代码运行结果:
结构体的下标操作这里只做技术上研究,实际开发中非常不提倡这么用。原因是这种结构体当成员很多时结构体占用内存将会非常大(结构体SIZE=MAX(成员SIZE)*成员数),而当结构体成员很少时完全没有必要用下标操作符。这种结构体的下标操作符在实际开发应用中,几乎是没有可用价值的。
要实现结构体的下标操作符,我们需要了解,我们所设定的结构体的成员大小必须有规律,那我们直接假设各成员的内存大小是相等的,就比较简单了。怎么样才能使结构体的成员内存大小都一样,而且我们还要使结构体支持不同类型的成员?这时就可以想到共同体union了,共同体的好处是各成员共享内存。
按这个思路,我们首先将我们需要的类似通过共同体自定义一种新的统一类型:
typedef union __un_MY_VAR { BYTE buf[1024]; TCHAR cBuf[512]; int iRs; float fRs; double dfRs; __un_MY_VAR() { clear(); } void clear() { memset(buf,0,1024); } } MYVAR;
以上我定义了一个新类型MYVAR,支持字符串、整形和浮点型。然后我们就可以用该新类型进行结构体的定义了:
typedef struct __stu_MY_DATA { MYVAR a; MYVAR b; MYVAR c; MYVAR d; } MYDATA;
以上机构体就是每个成员存储的内存大小相等的。这时候就可以通过重载下标操作符的方法,实现下标操作符功能,思路是通过成员地址偏移来寻址成员,新的结构体如下:
typedef struct __stu_MY_DATA { MYVAR a; MYVAR b; MYVAR c; MYVAR d; MYVAR operator[](int index) const { return *(&(this->a) + index); } MYVAR & operator[](int index) { return *(&(this->a) + index); } } MYDATA;
这样一来,假设有一个结构体对象
MYDATA data;
那么我们就可以直接通过下标来操作结构体成员了,例如data[0],data[1],data[2]的形式。
我编写了完整的测试代码如下:
// testUnionStruct.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
#pragma pack(1)
typedef union __un_MY_VAR { BYTE buf[1024]; TCHAR cBuf[512]; int iRs; float fRs; double dfRs; __un_MY_VAR() { clear(); } void clear() { memset(buf,0,1024); } } MYVAR;
typedef struct __stu_MY_DATA { MYVAR a; MYVAR b; MYVAR c; MYVAR d; MYVAR operator[](int index) const { return *(&(this->a) + index); } MYVAR & operator[](int index) { return *(&(this->a) + index); } } MYDATA;
#pragma pack()
#ifdef _UNICODE
#define tcout std::wcout
#define tstrlen wcslen
#else
#define tcout std::cout
#define tstrlen strlen
#endif
int _tmain(int argc, _TCHAR* argv[])
{
MYVAR myArray[4];
myArray[0].fRs = (float)1.23;
myArray[1].dfRs = (double)2.56789;
myArray[2].iRs = (int)3;
memcpy(myArray[3].cBuf,_T("A测试B"),7);
MYDATA data;
for (int i=0;i<4;i++)
{
data[i] = myArray[i];
}
#ifdef _UNICODE
locale::global(locale(""));
wcout.imbue(locale(""));
#endif
tcout<<data[0].fRs<<std::endl;
tcout<<data[1].dfRs<<std::endl;
tcout<<data[2].iRs<<std::endl;
tcout.write(data[3].cBuf,tstrlen(data[3].cBuf));
tcout<<std::endl;
return 0;
}
以上代码运行结果:
相关文章推荐
- 如何用VC60实现类似windows搜索文件的功能,针对文件夹中包含的文件名进行模糊查
- java用类实现结构体数组功能
- 在C#中实现类似C++函数指针数组的功能
- 在Delphi中实现类似VC++的Configuration功能
- VC写的Flash动画播放组件 ,实现透明播放Flash动画及交互功能,类似迅雷及PPS广告动画
- VC实现类似VB中的LinkLabel功能
- 用C语言写一个数组,实现类似JAVA语言中ArrayList的功能
- c++(vc)实现类似qq窗口悬挂功能
- c/c++实现的一个动态分配内存的结构体数组(类似vector)
- 用Win32实现类似MFC中Draw3dRect函数的功能
- 通过Java SE 7自带的监控服务(WatchService API)实现类似.NET FileWatcher的功能
- 实现vue-gridlayout的类似功能
- C语言结构体+数组实现学生学号成绩的统计、排序
- ios实现类似魔兽小地图功能 在
- 天易10----js实现的类似百度地图(带查询功能)
- MVC实现类似QQ的网页聊天功能-ajax(下)
- Ajax(1)实现类似验证该用户名能否注册功能
- windows客户端实现类似windows系统右键新建菜单功能
- VC++ 实现一个简单串口调试助手(功能少,但封装合理)
- 请写一个函数,实现类似的strcpy的字符串复制功能