(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 而不是其中存在错误。