C++:运算符重载,运算符+

C++ : Operator Overloading, operator+

本文关键字:运算符 重载 C++      更新时间:2023-10-16
#include<iostream>
#include"polynom.h"
using namespace std;
// operator= works !!!
int main()
{
    Polynomial p(5), q(5), r(5);
    cout<<"1"<<endl;
    cin>>x;
    p[0] = 1;
    p[1] = 2;
    p[2] = 3;
    q[0] = 4;
    q[1] = 5;
    q[2] = 6;
    cout<<p+q;
    return 0;
}

Polynomial::Polynomial(const Polynomial &copyConstructor) : size(copyConstructor.size)
{ 
    coeffs = new double(size);
    int i=0;
    while(i<size)
    {
        coeffs[i] = copyConstructor.coeffs[i];
        i++;
    }
} 

Polynomial::Polynomial(int s)
{
    size = s;
    coeffs = new double [s];
    // Setting all coefficients in the polynomial equal to 0 
    for(int i=0; i<size; i++)
        coeffs[i]=0;
}

Polynomial Polynomial::operator+ (const Polynomial &rightPoly) const
{
    int BigSize, SmallSize;
    Polynomial *newPoly = NULL;
    cout<<"in the operatorn";
    if(size == rightPoly.size)
    {
        cout<<"first ifn";
        newPoly = new Polynomial(size);
        cout<<"first if resizen";
        for(int i=0; i<newPoly->size; i++)
            cout<<newPoly->coeffs[i]<<endl;
        cout<<"size = "<<size<<endl;
        cout<<"rightPoly.size = "<<rightPoly.size<<endl;
        cout<<"newPoly->size = "<<newPoly->size<<endl;
        cout<<"first if loopn";
        for(int i=0; i<size; i++)
        {
            cout<<"i= "<<i;
            newPoly->coeffs[i] = rightPoly.coeffs[i]+coeffs[i];
            cout<<" newPoly[]"<<newPoly->coeffs[i]<<endl;
        }
        cout<<"out of loopn"<<endl;
    }

    else if(size > rightPoly.size)
    {
        cout<<"second ifn";
        BigSize = size;
        SmallSize = rightPoly.size;
        newPoly = new Polynomial(BigSize);
        cout<<"second if loopn";
        for(int i=0; i<SmallSize; i++)
            newPoly->coeffs[i] = rightPoly.coeffs[i] + coeffs[i];
        for(int i=SmallSize; i<BigSize; i++)
            newPoly->coeffs[i] = coeffs[i];
        cout<<"second if loop endn";
    }
    else
    {
        cout<<"third ifn";
        BigSize = rightPoly.size;
        SmallSize = size;
        newPoly = new Polynomial(BigSize);
        for(int i=0; i<SmallSize; i++)
            newPoly->coeffs[i] = coeffs[i] + rightPoly.coeffs[i];
        for(int i=SmallSize; i<BigSize; i++)
            newPoly->coeffs[i] = rightPoly.coeffs[i];
    }
    cout<<"before returnn";
    return *newPoly;    
}

问题:当 Visual Studio 2010 执行 p+q 行时,它会给出以下错误。p 和 q 的大小相同,并且它们已正确初始化(我检查了它们)。

Windows has triggered a breakpoint in CNG242.exe.
This may be due to a corruption of the heap, which indicates a bug in CNG242.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while CNG242.exe has focus.
The output window may have more diagnostic information.

我添加了注释,以便遵循这些行并找出问题所在。我不明白导致错误的原因是什么?

表达式

coeffs = new double(size);

一个double变量分配空间,将其值初始化为 size ,并返回指向 coeffs 的指针。您可能想要的是:

coeffs = new double[size];

请注意方括号。这将初始化size双精度的空间,不会将它们初始化为任何特定内容,并返回指向第一个指向coeffs的指针。

堆块溢出

coeffs = new double(size); // You allocated memory for only one double variable

这边。