阵列"休息"调整大小时

时间:2014-04-21 16:08:11

标签: c++ arrays

好吧,我有一个类,它应该是二次多项式的容器(这是一个模板,我在那里使用浮点数,但这不重要)。我使用动态数组制作它,我应该重载+和 - 运算符......不是问题,是吗?好吧,在我实际运行它之前,它似乎都很好用而且花花公子。

listf listf::operator+(listf rhs)
{
    listf newlist;
    for(int i = 0; i < elementcount; ++i)
        newlist.add(array[i]);
    for(int j = 0; j < rhs.elementcount; ++j)
        newlist.add(rhs.array[j]);
    std::cout<<newlist;
    return newlist;
}

没什么。应该正确地完成它的工作吧?那个cout只是为了检查它是否有效。但事实并非如此。 应该这样做,对吧? 有一个列表包括:

X^2+5x+52.4
2X^2+7x-12

并且第二个只有X ^ 2 + 2X + 1,它应该列出并显示:

X^2+5x+52.4
2X^2+7x-12
X^2+2X+1

Buuuut不,它来了:

-1.5584e+038X^2-1.5584e+038x-1.5584e+038
-1.5584e+038X^2-1.5584e+038x-1.5584e+038
-1.5584e+038X^2-1.5584e+038x-1.5584e+038

我已经与它斗争了很长一段时间,但却没有找到原因。

添加新多项式的代码仍然非常简单:

void listf::add(polynomial<float> plnm)
{
    if(array == NULL)
    {
        ++elementcount;
        array = new polynomial<float>[elementcount];
        array[0] = plnm;
    }
    else
    {
        array = resize(array, elementcount+1, elementcount);
        array[elementcount++] = plnm;
    }
}

resize是这个类中的私有函数:

polynomial<float>* listf::resize(polynomial<float>* arr, int newSize, int oldSize)
{
    polynomial<float>* newArr = new polynomial<float>[newSize];
    for(int i = 0; i < oldSize; ++i)
    {
        newArr[i] = arr[i];
    }
    delete[] arr;
    return newArr;
}

如果我们正在制作一个较小的数组(用于删除对象),我只是将oldSize等于newSize(我知道这是一个糟糕的做法并且让其他人感到困惑,但我只是在测试东西:()

我没有想法。向对象添加新元素似乎有效,但是当我想要添加两个对象时,它会打破,打印不正确的元素,然后使用CodeLite报告类似&#34; ntdll!LdrVerifyImageMatchesChecksumEx&#34;在调用堆栈中。更好的是,当我现在测试它时,它显示正确的值,但在返回时仍然崩溃。

2 个答案:

答案 0 :(得分:1)

忘记自制的动态数组并使用向量。无论何时进入类和内存管理领域,编写一些新的[]和delete []调用都不是一件容易的事。它可以阻止你在程序开发过程中陷入困境。

#include <vector>
//...
typedef std::vector<polynomial<float> > PolynomialFloatArray;
//...
class listf
{
   PolynomialFloatArray array;
   //...
   void add(const polynomial<float>& plnm);
   //...
   PolynomialFloatArray& resize(PolynomialFloatArray& arr, int newSize)
};
//...
void listf::add(const polynomial<float>& plnm)
{
   array.push_back(plnm);
}

PolynomialFloatArray& listf::resize(PolynomialFloatArray& arr, int newSize)
{
   arr.resize(newSize);
   return arr;
}

简而言之,就是你编写的所有代码,减少到2或3行。

答案 1 :(得分:0)

就像问题上的评论一样,你可能最好使用std::vector,因为它有push_back()来添加内容,并自动调整大小以实现这一目的,虽然您可以强制它使用resize()调整大小。