2014-04-21 45 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

相關問題