我正在尝试实现一个交换函数,它会覆盖复制构造函数,并最终允许我使用相等的' ='运营商。问题是在测试我的交换函数时,我得到了其他所有内容的垃圾值(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因为这个数字干扰了我的打印功能。
答案 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