(c++) 需要帮助为我的 class 多项式重载 operator+
(c++) Need help overloading operator+ for my class Polynomial
所以我试图为我的多项式数组重载运算符 +,但我不断收到 _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;
}
辛:
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;
}
复制构造函数似乎有问题。
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];
}
如何用类似多项式的形式编写一个简单的运算符 + class:
第 1 步:不要将存储逻辑与其他逻辑混合。存储已经够棘手了。将您的数据存储在 std::vector
中,并将其大小用作您的大小。
第二步:零规则。要么无法实施,要么 =default
,您的 move/copy 分配和执行者。有时会实现一个 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;
}
也可以添加 trim 前导零的代码。
第 4 步:按如下方式实施 operator+
:
friend Foo operator+(Foo lhs, Foo const& rhs){
lhs+=rhs;
return std::move(lhs);
}
大功告成。 (将 Foo
替换为您的类型名称)。您甚至可以从中获得高效 r = a+b+c+d
。
您的复制 ctor 可能已损坏,但我认为您的问题实际上是您 拥有 复制 ctor 而不是其中存在错误。
所以我试图为我的多项式数组重载运算符 +,但我不断收到 _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;
}
辛:
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;
}
复制构造函数似乎有问题。
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];
}
如何用类似多项式的形式编写一个简单的运算符 + class:
第 1 步:不要将存储逻辑与其他逻辑混合。存储已经够棘手了。将您的数据存储在 std::vector
中,并将其大小用作您的大小。
第二步:零规则。要么无法实施,要么 =default
,您的 move/copy 分配和执行者。有时会实现一个 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;
}
也可以添加 trim 前导零的代码。
第 4 步:按如下方式实施 operator+
:
friend Foo operator+(Foo lhs, Foo const& rhs){
lhs+=rhs;
return std::move(lhs);
}
大功告成。 (将 Foo
替换为您的类型名称)。您甚至可以从中获得高效 r = a+b+c+d
。
您的复制 ctor 可能已损坏,但我认为您的问题实际上是您 拥有 复制 ctor 而不是其中存在错误。