在C ++类中重载交换函数

时间:2017-09-24 20:47:07

标签: c++

我正在尝试实现一个交换函数,它会覆盖复制构造函数,并最终允许我使用相等的' ='运营商。问题是在测试我的交换函数时,我得到了其他所有内容的垃圾值(isNeg是bool,数字是unsiged int *数组,numDigits是大小 数字。
ReallyLongInt是一个大小为numDigits的Unsigned Int *数组,我已经彻底测试了我的构造函数,它们适用于Strings和long longs。

这是声明(ReallyLongInt.cc):

void ReallyLongInt::swap(ReallyLongInt other)
{

  //Sets temporary values to equal others values
  unsigned int* temp = new unsigned int[this->numDigits];

  std::swap(this->digits, other.digits);
  std::swap(this->numDigits, other.numDigits);
  std::swap(this->isNeg, other.isNeg);

 }

和我用来测试的main(main.cc)

#include "ReallyLongInt.h"
#include <iostream>


using namespace std;


int main(int argc, char** argv){
  string a = "56789";
  long long b = 123456;


  ReallyLongInt x = ReallyLongInt(a);
  ReallyLongInt y = ReallyLongInt(b);
  cout<<"a: "<<x<<endl;
  cout<<"b: "<<y<<endl;
  y.swap(x);

  cout <<"b after swapping with a:  "<< y <<endl;


}

我认为问题在于我传递给我的交换电话的价值

y.swap(x)

但是当我运行代码时,这个&gt; numDigits的大小是垃圾,我得到一个segFault因为这个数字干扰了我的打印功能。

2 个答案:

答案 0 :(得分:1)

void ReallyLongInt::swap(ReallyLongInt other)

任何指定参数“按值传递”的函数意味着每次调用函数时都会初始化一个新副本。因此,当您致电y.swap(x)时,您正在修改功能局部变量other,而不是您想要的对象x

要允许函数修改传入的对象,您应该使用引用参数:

void ReallyLongInt::swap(ReallyLongInt& other);

顺便说一下,一些标准函数检查的swap的正常形式是一个带有两个参数的非成员函数。所以在课堂之外:

void swap(ReallyLongInt& a, ReallyLongInt& b);

如果您愿意,可以根据成员swap实施非成员swap

答案 1 :(得分:0)

正如aschepler所说,

void ReallyLongInt::swap(ReallyLongInt& other);

此外,在交换功能中使用新的方式是错误的。您分配一个新结构然后放弃它。标准C ++不进行垃圾收集,因此临时对象是内存泄漏。

您可以比尝试修复此代码做得更好。这是一个线程,显示了专门交换的最佳实践,包括复制和交换习语。享受。

http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom