+ -
当前位置:首页 → 问答吧 → 求结构体的深拷贝

求结构体的深拷贝

时间:2011-12-22

来源:互联网

小弟做一客户端程序,登录时,服务端响应登录函数发来几个结构体数据,在API接口中定义,分别假设为
  Struct _mStruct1 mstruct1,Struct _mStruct2 mstruct2,int ID,bool flag;
传送过来时,是结构体的指针
  *mstruct1,*mstruct2,ID,flag

因为结构体下字段太多,所以我就定义了一结构体,来接收传来的数据,我定义的结构如下:
C/C++ code

Struct ReciveData
{
    _mStruct1 *mstruct1;
    _mStruct2 *mstruct2;
    int *ID;
    bool *flagl
} mReciveData;


  memcpy显然不行,而如果重载operate=或者写拷贝构造函数的话,是否只针对我自定义的结构体呢?对于API传来的结构体是否有效?
   
  求应该怎样深拷贝?

作者: lrypower   发布时间: 2011-12-22

C/C++ code
Struct ReciveData
{
    _mStruct1 *mstruct1;
    _mStruct2 *mstruct2;
    int *ID;
    bool *flagl
    ReciveData():mstruct1(NULL),mstruct2(NULL),ID(NULL),flagl(NULL){}
   ~ReciveData(){if(NULL != mstruct1)delete mstruct1;.....}
} mReciveData;


mReciveData.mstruct1 = new mStruct1(mstruct1); 
...

作者: qscool1987   发布时间: 2011-12-22

memcpy只能拷贝POD型别对象(不存在指针和需要内存分配操作的结构体)
感觉你这里需要一个setData的方法,是不是重载operator=都一样,只要把数据弄进去就行
重载operator=的时候带上API跟一样的参数就能传递数据了吧

作者: imstyle1001   发布时间: 2011-12-22

引用 1 楼 qscool1987 的回复:

C/C++ code
Struct ReciveData
{
_mStruct1 *mstruct1;
_mStruct2 *mstruct2;
int *ID;
bool *flagl
ReciveData():mstruct1(NULL),mstruct2(NULL),ID(NULL),flagl(NULL){}
~ReciveData(){i……


mReciveData.mstruct1 = new mStruct1(mstruct1); 
大哥,new mStruct1(mstruct1)是不是就已经赋值给我的结构体成员了?new后面的参数mstruct1是否是服务端传过来的数据?

作者: lrypower   发布时间: 2011-12-22



老实写拷贝构造函数吧。。。

作者: hzhxxx   发布时间: 2011-12-22

引用 4 楼 hzhxxx 的回复:
老实写拷贝构造函数吧。。。


这也只是针对我定义的结构体吧,API传过来的东西怎么操作呢?

作者: lrypower   发布时间: 2011-12-22

引用 5 楼 lrypower 的回复:
引用 4 楼 hzhxxx 的回复:
老实写拷贝构造函数吧。。。


这也只是针对我定义的结构体吧,API传过来的东西怎么操作呢?

干嘛不写类呢 偏要写结构体 搞不懂

作者: jeje1115   发布时间: 2011-12-22

和类的深拷贝一样,自己new分配空间,结构体之间数据的移值。

作者: woshiwaiwai   发布时间: 2011-12-22

楼主,如果你要写拷贝构造函数,就把默认构造函数和析构函数都写出来,因为你的拷贝构造里要new内存,所以默认构造里也要new,这样析构里就要delete。

作者: pengjialaosan   发布时间: 2011-12-22

从你的问题来看,如果API接口返回的数据流如下格式:
Struct _mStruct1 mstruct1,Struct _mStruct2 mstruct2,int ID,bool flag;

你是可以直接指定结构体方式来读取数据的,只是这里需要保证对方使用相同的体系结构(大头,小头)还有处理器位数,编译对齐等相关信息,还有如果struct中的数据包含指针,那这种方法也不行。我这里假设struct定义的都是普通的非指针数据,而且上述情况都相同,你可以使用memcpy,或者直接使用类型指针读取。

Struct ReciveData
{
  _mStruct1 mstruct1;
  _mStruct2 mstruct2;
  int ID;
  bool flagl
}ReciveData, *PReciveData;
//上面都直接使用类型定义,不是使用指针定义,这样假设你的接收的数据地址为pRecvData,你可以直接访问ID字段:
((PReciveData)pRecvData)->ID

作者: yin138   发布时间: 2011-12-22