c++ - 调整大小时数组 "breaks"

标签 c++ arrays

好吧,我有一个类应该是二次多项式的容器(这是一个模板,我在那里使用 float ,但这应该没什么大不了的)。我是用动态数组做的,我应该重载 + 和 - 运算符……没问题,是吗?好吧,在我真正运行它之前,它看起来一切都很好而且花花公子。

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是这个类中的私有(private)函数:

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 崩溃,在调用堆栈中报告类似“ntdll!LdrVerifyImageMatchesChecksumEx”的内容。更好的是,当我现在测试它时,它显示了正确的值,但在返回时仍然崩溃。

最佳答案

忘掉自制的动态数组,使用 vector 吧。每当您进入类和内存管理领域时,它都不像编写一些 new[] 和 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 行。

关于c++ - 调整大小时数组 "breaks",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201082/

相关文章:

java - 数组。直方图,将数组划分为子集并计算每组中的元素数量。 java

javascript - 基于字符串创建具有动态属性名称的对象

javascript - 对混合字母/数字数组进行排序

c++ - 'std::string' 没有名为 'front' 的成员

c++ - 抽象类的命名约定?

c++ - 循环帮助 : string vector to 3D char vector

javascript - 在 mongoose express 中选择几个字段作为数组

c - 为什么排序后数组元素发生了变化,C

c++ - 运行 QT Creator 时 OpenGL 的问题

c++ - Ultralight - 如何最小化窗口