您的位置:首页 > 编程语言 > C语言/C++

VC结构体实现类似数组的下标操作符功能

2014-02-13 19:08 741 查看
在某些特殊时候,我们会想如果结构体也能向数组一样通过下标操作符进行操作的话,代码将直接通过循环语句就能实现,尤其当我们的数据来源于数据库获得的数据集时,这种用法还是比较有意思的。

结构体的下标操作这里只做技术上研究,实际开发中非常不提倡这么用。原因是这种结构体当成员很多时结构体占用内存将会非常大(结构体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;
}


以上代码运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CC++ 结构体 下标 成员