【问题标题】:(c++) Need help overloading operator+ for my class Polynomial(c++) 需要帮助为我的类多项式重载 operator+
【发布时间】:2016-03-09 19:27:42
【问题描述】:

所以我试图为我的多项式数组重载运算符 +,我不断收到 _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;
}

【问题讨论】:

  • 你能展示你的构造函数吗?你是怎么分配p.arr的?
  • 内存管理失败。您可以将int* arr; 替换为std:::vector&lt;int&gt; arr(并去掉int size;
  • 我们还没有学习矢量所以我不能使用它们:|
  • operator+ 中,您正在创建默认的Polinomial 对象(如何完成创建 - 我们不知道),并且在立即 for 循环中,您正在循环它的大小(完全忽略你的论点的大小,可能超出他们的界限)。那么,这些对象是如何构造的呢?它们是如何复制构建的?
  • 因此,由于您没有在示例中创建具有自定义大小的Polynomial,因此这不是导致崩溃的原因,但仍然是一个问题,需要修复乙>。我想看看,您的 Polynomial 对象的复制构造/破坏情况如何。

标签: c++ operator-overloading


【解决方案1】:

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

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

}

【讨论】:

  • 你是不是忘记了什么?例如数组分配(即arr = new [p.size];)和size初始化(即size = p.size)? ;) 刚刚注意到您的最后一行:复制构造函数不是赋值运算符。对象是用它构造的,不可能是them being different sizes
  • 是的,这肯定是罪魁祸首。对@gil 的建议:摆脱需要大小的构造函数。在让其余代码可靠运行之前不要放回去,然后仔细查看所有代码以找到对数组大小做出假设的地方。
  • 我在这样做的时候陷入了无限循环
  • @AlgirdasPreidžius - 是的,这是必要的,但对于这个特定的例子(这是评论的重点,即“假设数组大小相同)。一次一步:处理不同的size 数组可以等到基本代码正常工作。
  • @PeteBecker 正如我的评论编辑所说:它是一个复制构造函数,而不是赋值运算符,them to be different sizes 不可能,因为调用构造函数的对象是'还没有建造。
【解决方案2】:

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

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

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

第四步:实现operator+如下:

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

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


您的复制 ctor 可能已损坏,但我认为您的问题实际上是您拥有一个复制 ctor 而不是其中有错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2016-03-01
    • 2012-05-03
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多