[英](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;
}
主要(僅用於檢查發生了什么):
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;
}
復制構造函數似乎有問題。
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];
}
如何在類似多項式的類中編寫Easy運算符+:
步驟1:請勿將存儲邏輯與其他邏輯混合使用。 存儲足夠棘手。 將數據存儲在std::vector
,並使用其大小作為大小。
步驟2:零規則。 無法實現,或者=default
,您的移動/復制分配和ctor。 有時實現一個dtor /零argtor,但不在那里分配資源:步驟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可能已損壞,但我認為您的問題實際上是您擁有的復制ctor多於其中的bug。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.