好吧,我有一个类,它应该是二次多项式的容器(这是一个模板,我在那里使用浮点数,但这不重要)。我使用动态数组制作它,我应该重载+和 - 运算符......不是问题,是吗?好吧,在我实际运行它之前,它似乎都很好用而且花花公子。
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;在调用堆栈中。更好的是,当我现在测试它时,它显示正确的值,但在返回时仍然崩溃。
答案 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()
调整大小。