簡體   English   中英

(C ++)需要幫助重載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;
}

主要(僅用於檢查發生了什么):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM