我正在尝试重载这样的赋值运算符 -
polynom polynom::operator=(const polynom& p)
{
this->grad = p.grad;
this->arr = new double[grad+1];
for(int i = 0; i <= p.grad; i++)
{
this->arr[i] = p.arr[i];
}
return *this;
}
这是.h文件:
#pragma once
using namespace std;
#include <iostream>
class polynom
{
public:
polynom(int grad, double* arr);
polynom(int grad);
polynom(polynom& p);
polynom();
~polynom(void);
polynom operator=(const polynom& p);
friend ostream& operator<<(ostream& os, const polynom& p);
private:
int grad;
double* arr;
};
的.cpp:
#include "polynom.h"
polynom::polynom(int grad, double* arr)
{
this->grad = grad;
this->arr = new double[grad+1];
for(int i = 0; i<=grad;i++)
{
this->arr[i] = arr[i];
}
}
polynom::polynom(int grad)
{
this->grad = grad;
this->arr = new double[grad+1];
}
polynom::polynom()
{
arr = NULL;
}
polynom::polynom(polynom& p)
{
}
polynom::~polynom()
{
delete[] arr;
}
polynom polynom::operator=(const polynom& p)
{
this->grad = p.grad;
this->arr = new double[grad+1];
for(int i = 0; i <= p.grad; i++)
{
this->arr[i] = p.arr[i];
}
return *this;
}
ostream& operator<<(ostream& os, const polynom& p)
{
for(int i = 0; i <= p.grad; i++)
{
if(i == 0)
os << p.arr[i];
else
{
if(p.arr[i]>=0)
os << " + ";
os << p.arr[i] << "x^"<<i;
}
}
return os;
}
主:
#include <iostream>
#include "polynom.h"
using namespace std;
void main()
{
double arr1[] = {1,2,3};
double arr2[] = {5,9};
double arr3[] = {1,2,3,4};
polynom p1(2, arr1);
polynom p2(1, arr2);
polynom p3(3, arr3);
cout << p1 << "\n";
p1 = p2 = p3;
cout << p1 << "\n";
std::system("pause");
}
我得到以下异常:
7.exe中的0x01331C16处的未处理异常:0xC0000005:访问冲突读取位置0x01337000。
在此行this->arr[i] = p.arr[i];
我对其原因一无所知。
答案 0 :(得分:2)
您的代码有很多问题。其中一个原因是您没有定义复制构造函数,但是您正在通过赋值运算符的值返回一个对象(*this
)。我猜想“复制”对象指向一些有趣的东西,并且访问此指针会导致未定义的行为。
那就是说,我很困惑任何人都可以应对赋值运算符的复杂性!您的赋值运算符有更多问题:
就个人而言,我在实现赋值运算符时遇到了麻烦,除非他们利用了复制构造函数,析构函数和swap()
函数(当然,我只用了近25年的C ++编程)年,所以也许我会在某些时候弄明白)。 swap()
可能尚不存在,但无论如何都应该实现:
polynom& polynom::operator= (polynom other) {
this->swap(other);
return *this;
}
void polynom::swap(polynom& other) {
std::swap(this->grad, other.grad);
std::swap(this->arr, other.arr);
}
当然,这假设您有一个工作副本构造函数。
以下是其他随机问题:
polynom
是否在NULL
中具有非arr
指针,但您的默认构造函数初始化arr
成员到NULL
。using namespace std;
应在之后包含标准标题,而不是之前。当然,标题应该有一个using
- 指令!至少在标题中,您最好使用完全限定条件,例如std::ostream
。<iostream>
,std::cout
,std::cin
,否则不应在标头中包含std::cerr
std::clog
!我会在标题中添加<iosfwd>
,在实现中包含<ostream>
,并且只在<iostream>
中包含实际内容。(我曾声称只存储指向数组的指针存在另一个问题,但这不是代码;我从列表中删除了它;抱歉)。