所以我试图为我的多项式数组重载运算符+,并且我一直得到_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)错误(第52行),我无法弄清楚原因。 问题必须是我重载operator +的方式,因为没有它就不会发生。
class Polynomial
{
public:
int compo;
int expo;
int size; // array size + largest exponent
friend ostream &operator<<(ostream&, const Polynomial &);
friend istream &operator>>(istream&, Polynomial &);
int* arr;
Polynomial();
Polynomial(int);
Polynomial(const Polynomial&);
~Polynomial();
int getSize();
Polynomial operator+(const Polynomial &);
private:
};
...
Polynomial Polynomial::operator+(const Polynomial &p)
{
Polynomial p1;
for (int i = 0; i < p1.size; i++)
{
p1.arr[i] = arr[i] + p.arr[i];
}
return p1;
}
main(仅用于查看正在进行的操作):
int main()
{
Polynomial p;
p.arr[2] = 4;
p.arr[0] = 4;
cout << p;
cout << "Enter compo, expo:\n";
cin >> p;
Polynomial z;
z = z + p;
cout << z;
return 0;
}
构造
Polynomial::Polynomial()
{
size = 100;
arr = new int[size];
}
Polynomial::Polynomial(int a)
{
size = a;
arr = new int[size];
}
复制构造函数:
Polynomial::Polynomial(const Polynomial& p)
{
arr = p.arr;
size = p.size;
}
析构函数:
Polynomial::~Polynomial()
{
delete[] arr;
}
CIN:
istream &operator>>(istream &input, Polynomial &p)
{
input >> p.compo;
input >> p.expo;
if (p.expo > p.size+1)
{
int *temp;
p.size = p.expo + 1;
temp = new int[p.expo + 1];
for (int i = 0; i < p.expo+1; i++)
{
temp[i] = p.arr[i];
}
delete[] p.arr;
p.arr = temp;
}
p.arr[p.expo] = p.compo;
return input;
}
答案 0 :(得分:4)
复制构造函数似乎有问题。
Polynomial::Polynomial(const Polynomial& p)
{
arr = p.arr;
size = p.size;
}
使用此方法,您可以指定指针,而不是数组。在一个循环中逐个元素地执行它
Polynomial::Polynomial(const Polynomial& p)
{
compo = p.compo;
expo = p.expo;
size = p.size;
arr = new int[size];
for(int i = 0; i< size; ++i)
arr[i] = p.arr[i];
}
答案 1 :(得分:1)
如何在多项式类中编写一个简单的运算符+:
步骤1:不要将存储逻辑与其他逻辑混合。存储很棘手。将您的数据存储在std::vector
中,并将其大小用作您的尺寸。
第2步:零规则。无法实施,或=default
,您的移动/复制分配和ctors。有时实现dtor / zero arg ctor,但不在那里分配资源:第1步涵盖了这一点。 (=default
可能不需要,但有时它是。不是在需要时记住它,而是在你真正想要默认的xopy / move明确的时候去做。)
第3步:实施operator+=
。它几乎总是比operator+
容易。它应该是4行长:
Foo& operator+=(Foo const& rhs){
storage.resize((std::max)(storage.size(),rhs.storage.size());
for(size_t i=0; i<rhs.storage.size();++i)
storage[i]+=rhs.storage[i];
return *this;
}
还可以添加修剪前导零的代码。
第4步:按如下方式实施operator+
:
friend Foo operator+(Foo lhs, Foo const& rhs){
lhs+=rhs;
return std::move(lhs);
}
你完成了。 (用您的类型名称替换Foo
)。你甚至可以从中获得高效率r = a+b+c+d
。
您的副本可能会被破坏,但我认为您的问题实际上是您拥有副本ctor而不是其中有错误。