VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1005|回复: 6

[求助] 结构体数组作为函数的参数,修改形参的同时如何不修改主函数的实参?

[复制链接]
82_avatar_middle
在线会员 发表于 2017-5-31 23:11:25 | 显示全部楼层 |阅读模式
3驿站币
struct MyTest
{
        CArray<int> *arrMy;
        int m_Num = 0;
};

void addMyCarry(CArray<MyTest> &arrParam)
{
        CArray<MyTest> arrMy;
        arrMy.RemoveAll();
        arrMy.Copy(arrParam);
        arrMy.GetAt(0).arrMy->Add(2);//我只想改变数组arrMy,却不想改变传递进来的参数arrParam。但是现在却改变了。我该怎么办?
}

void CMFCApplication1Dlg::OnBnClickedButton1()
{
        // TODO:  在此添加控件通知处理程序代码
        CArray<MyTest> arrMyTest;
        MyTest mTest;
        mTest.arrMy = new CArray < int > ;
        mTest.arrMy->Add(1);
        mTest.m_Num = 1;
        arrMyTest.Add(mTest);
        addMyCarry(arrMyTest);//该处调用之后改变了数组arrMyTest。而我不想使其变化该如何修改呢?
}







上一篇:vs2008 c++项目编译奇怪问题
下一篇:VC++6.0下http访问的最佳库
82_avatar_middle
ico_lz  楼主| 发表于 2017-5-31 23:13:27 | 显示全部楼层
请各位大大帮忙解决下,困扰好几天了,网上找了也没找到方法。谢谢~~
51_avatar_middle
online_admins 发表于 2017-6-1 00:30:36 | 显示全部楼层
因为 MyTest 结构体中,CArray<int> *arrMy; 是指针类型,所以调用 arrMy.Copy(arrParam); 进行拷贝之后也只是拷贝了这个指针,并没有进行内存拷贝,所以arrMy中的 arrMy 也同样指向 mTest.arrMy = new CArray < int > ; 所以就都改变了。可以自己实现 MyTest 的拷贝构造函数和重载等号运算符,这样让其 MyTest 类型在进行拷贝和复制的时候不是单纯的进行 = 号赋值,而是进行内存拷贝,这样就互不干预了。
82_avatar_middle
ico_lz  楼主| 发表于 2017-6-1 07:05:02 | 显示全部楼层
Syc 发表于 2017-6-1 00:30
因为 MyTest 结构体中,CArray *arrMy; 是指针类型,所以调用 arrMy.Copy(arrParam); 进行拷贝之后也只是拷 ...

老大能否给写一下,我实在是不会。网上也没找到范例。谢谢~~
82_avatar_middle
ico_lz  楼主| 发表于 2017-6-1 09:44:44 | 显示全部楼层
Syc 发表于 2017-6-1 00:30
因为 MyTest 结构体中,CArray *arrMy; 是指针类型,所以调用 arrMy.Copy(arrParam); 进行拷贝之后也只是拷 ...

我又重新写了一个函数对其进行重新赋值后可以解决这个问题。但是老大说的方法我还是不会,请老大有时间给我写下吧!不胜感激!!!
51_avatar_middle
online_admins 发表于 2017-6-1 09:53:36 | 显示全部楼层
nsky567 发表于 2017-6-1 07:05
老大能否给写一下,我实在是不会。网上也没找到范例。谢谢~~


结构体代码改成这样,其他不用动:
  1. struct MyTest
  2. {
  3.         MyTest()
  4.         {
  5.                 arrMy = NULL;
  6.         };

  7.         MyTest(MyTest& item)
  8.         {
  9.                 if (arrMy) delete arrMy;
  10.                 arrMy = new CArray<int>;
  11.                 arrMy->Copy(*item.arrMy);
  12.                 m_Num = arrMy->GetSize();
  13.         };

  14.         MyTest& operator=(const MyTest& item)
  15.         {
  16.                 if (arrMy) delete arrMy;
  17.                 arrMy = new CArray<int>;
  18.                 arrMy->Copy(*item.arrMy);
  19.                 m_Num = arrMy->GetSize();

  20.                 return *this;
  21.         }

  22.         ~MyTest()
  23.         {
  24.                 if (arrMy)
  25.                 {
  26.                         delete arrMy;
  27.                         arrMy = NULL;
  28.                 }
  29.         };
  30.         CArray<int> *arrMy;
  31.         int m_Num = 0;
  32. };
复制代码
82_avatar_middle
ico_lz  楼主| 发表于 2017-6-1 14:33:48 | 显示全部楼层
Syc 发表于 2017-6-1 09:53
结构体代码改成这样,其他不用动:

非常非常非常非常非常感谢.....
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-7-24 00:54

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表