2014-04-21 43 views
0

嗯,我有一个类应该是二次多项式的容器(这是一个模板,我在那里使用了浮点数,但这应该不重要)。我使用动态数组创建它,并且我应该重载+和 - 操作符...不是问题,呃?那么,直到我真正运行它,它似乎都很好,很棒。当调整大小时数组“破”

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

和调整在这个类私有函数:

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(我知道这是一个糟糕的做法和其他人混淆,但我只是测试的东西:()

我不知道。 bject似乎可行,但是当我想添加两个对象时,它会打印出不正确的元素,然后使用CodeLite报告类似于Call Stack中的“ntdll!LdrVerifyImageMatchesChecksumEx”报告。更好的是,当我现在进行测试时,它显示正确的值,但仍然在返回时崩溃。

+5

只要使用一个'std :: vector >'那么它会照顾到你。 – Mgetz

+0

你可以发布足够的代码来构建和测试吗?请[阅读本文](http://www.sscce.org/)了解良好示例代码的说明。 –

+2

@ user3556899 - 正如您指出的那样,您正试图用这个动态数组重新发明轮子。 'std :: vector'有'push_back()'将一个项目添加到vector的末尾,'resize()'改变了vector的大小等等。 – PaulMcKenzie

回答

0

像问题的评论所指出的,你可能会更好使用std::vector这一点,因为它有push_back()到的东西添加到末尾,并自动调整自己这样做,但你可以迫使它调整与resize()

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行。

+0

呃,问题是我不应该使用这个...如果我可以,我不会问,只是使用矢量。 – user3556899

+0

@ user3556899 - '呃,问题是我不应该使用'那么你的应用程序的目标是什么?它是否实现了一个动态数组?如果是这样,为什么用多项式解决混乱的东西?只需创建一个动态数组类,而不管它将用于什么应用程序。但是,如果目标是创建一个解决多项式的应用程序,那么为什么它会被一个非工作的动态数组类所阻碍?只需使用std :: vector。 – PaulMcKenzie

相关问题