(c ++)需要帮助重载operator +为我的类Polynomial

时间:2015-12-04 18:57:09

标签: c++ operator-overloading

所以我试图为我的多项式数组重载运算符+,并且我一直得到_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;
}

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;
}

2 个答案:

答案 0 :(得分:4)

复制构造函数似乎有问题。

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];

}

答案 1 :(得分:1)

如何在多项式类中编写一个简单的运算符+:

步骤1:不要将存储逻辑与其他逻辑混合。存储很棘手。将您的数据存储在std::vector中,并将其大小用作您的尺寸。

第2步:零规则。无法实施,或=default,您的移动/复制分配和ctors。有时实现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;
}

还可以添加修剪前导零的代码。

第4步:按如下方式实施operator+

friend Foo operator+(Foo lhs, Foo const& rhs){
  lhs+=rhs;
  return std::move(lhs);
}

你完成了。 (用您的类型名称替换Foo)。你甚至可以从中获得高效率r = a+b+c+d

您的副本可能会被破坏,但我认为您的问题实际上是您拥有副本ctor而不是其中有错误。