【发布时间】:2014-04-21 16:08:11
【问题描述】:
好吧,我有一个类,它应该是二次多项式的容器(这是一个模板,我在那里使用浮点数,但这并不重要)。我使用动态数组制作它,并且我应该重载 + 和 - 运算符......不是问题,是吗?好吧,在我真正运行它之前,它看起来一切都很好。
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
不,是这样的:
-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 在调用堆栈中报告类似“ntdll!LdrVerifyImageMatchesChecksumEx”的内容。更好的是,当我现在对其进行测试时,它显示了正确的值,但在返回时仍然崩溃。
【问题讨论】:
-
只需使用
std::vector<ploynomial<float> >,它就会为您解决这个问题。 -
您能发布足够多的代码供我们构建和测试吗?请read this 获取良好示例代码的描述。
-
@user3556899 - 正如所指出的,您正试图用这个动态数组重新发明轮子。
std::vector有push_back()在向量的末尾添加一个项目,有resize()来更改向量的大小等。 -
呃,不能使用 std::vector,这是一个问题。其次,虽然我可以提供整个代码,但包括类和模板在内的代码非常多,而且更大的问题是它不是英文的,不容易阅读。
-
有什么理由不能使用
std::vector?