2012-02-10 78 views
1

我有一個模板類,它使用數組和當前大小存儲對象的集合。我想出了插入和刪除。我在isEmpty函數中遇到困難。它返回false(好像它不是空的),即使當我加入說3和5,然後刪除3和5時。它應該然後說true如何插入數組? C++

#include <cstdio> 
#include <iostream> 
#include <cstdlib> 

/************************************************************/ 
// Local includes 

/************************************************************/ 
// Using declarations 

using namespace std; 

/************************************************************/ 
template <class T> 
class Collection 
{ 
public: 

    Collection (int mArraySize) 
    { 
    m_size = mArraySize; 
    array = new T[mArraySize]; 
    reset(); 
} 
/************************************************************/ 

int 
size() 
{ 
    return nextEmpty; 
} 

/************************************************************/ 

void 
reset() 
{ 
    nextEmpty = 0; 
    nextToRead = 0; 
} 

/************************************************************/ 

void 
insert(const T& a) 
{ 
    if (nextEmpty < m_size) 
    { 
     array[nextEmpty++] = a; 
    } 
} 

/************************************************************/ 

bool 
isEmpty() 
{ 
    if(m_size == 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

/************************************************************/ 

void 
makeEmpty() 
{ 
    m_size = 0; 
    array = NULL; 
} 

/************************************************************/ 

void 
remove(const T& r) 
{ 
    int i = 0; 
    for (i = 0; i < m_size; i++) 
    { 
     if (array[i] == r) 
     { 
      break; 
     } 
    } 
    while (i++ < m_size) 
    { 
     array[i - 1] = array[i]; 
    } 
    m_size--; 
} 

/************************************************************/ 


void 
contains(T array, T target) 
{ 

    for(int i = 0; i < m_size; i++) 
    { 

    } 
} 

/************************************************************/ 

T& 
get() 
{ 
    return array[nextToRead++]; 
} 

/************************************************************/ 

private: 

T* array; 
int nextEmpty; 
int nextToRead; 
int m_size; 
}; 

/************************************************************/ 

#include <iostream> 
#include <iterator> 

/****************************************************************************/ 
// Local includes 
#include "header.h" 

/****************************************************************************/ 
// Using declarations 

using namespace std; 

/****************************************************************************/ 
// Prototypes, typedefs, etc. 

bool 
isEmpty(); 

void 
makeEmpty(); 

void 
insert(); 

void 
remove(); 

void 
contains(); 

void 
testerFcn(); 

/****************************************************************************/ 

int main(int argc, char* pArgs[]) 
{ 
    testerFcn(); 

    return EXIT_SUCCESS; 
} 

/************************************************************/ 

void 
testerFcn() 
{ 
    Collection <int> testArray(15); 

    // insert test 
    cout << "Enter numbers to add to array (enter negative number to finish): " << endl; 

    for(;;) 
    { 
     int n; 
     cin >> n; 

     if (n < 0) { 
      break; 
     } 
     testArray.insert(n); 
    } 

    // remove test 
    cout << "Enter value to remove, (enter negative number to finish): " << endl; 

    for(;;) 
    { 
     int n; 
     cin >> n; 

     if (n < 0) { 
      break; 
     } 
     testArray.remove(n); 
    } 

    cout << "Is the array empty: 0 = false, 1 = true ==> " << testArray.isEmpty() << endl; 

    // print what we have 
    cout << "New Array: " << endl; 
    for (int i = 0; i < testArray.size(); i++) 
    { 
     cout << i << ":" << testArray.get() << endl; 
    } 
} 
+0

這功課嗎?任何不使用矢量的理由? – Bart 2012-02-10 21:45:18

+0

這是你的真實碼嗎?它充斥着編譯錯誤。你有沒有試過編譯它並運行它來測試?我假設這是家庭作業,所以我現在暫緩回答。如果這是作業,我可以給你的最重要的建議是學會使用調試器,儘早編譯並開始編譯,並開始爲你的功能編寫單元測試。 – Chad 2012-02-10 21:48:07

+0

是的。我們可以和其他人一起工作。是的,對於這門課程,我們剛開始使用C++,所以我們還沒有學習矢量。我知道他們是什麼,但考慮到我們還沒有從技術上了解他們,我不應該使用他們。 – user1202950 2012-02-10 21:49:29

回答

2

由於您是C++新手,我建議您在這裏採取小步驟。你的語法大部分都是不正確的,我覺得你可以做更好的事情,讓你在擔心複製項目和調整數組大小之前真正編譯一些最小類。但既然你走了這麼遠,這裏有一些一般性的建議(我不會明顯寫正確的代碼爲你因爲這是家庭作業):

  • 您正在使用T互換作爲您的包含的類型和數組的類型。實際上,調用new T[x]會給你一個指向t的指針,即。一個T*。您需要了解兩者之間的區別以學習C或C++。

  • 您的ensureCapacity函數有兩個參數。你不應該把成員變量m_array作爲一個參數 - 它實際上根本不會做你想要的東西(對於獎勵積分,想想會做什麼)。同樣考慮一下minimumCapacity是否也是T

  • 您在ensureCapacity中分配了兩個新陣列,從來沒有delete任何東西。請記住,這是C++,你必須以某種方式釋放內存。另外,你應該只需要一個新的,更大的陣列 - 我想這裏可能會有一些困惑,圍繞着TT*之間的區別,關於如何交換它們。

  • 你確定比較m_array[m_size] < minimumCapacity?你在這裏比較什麼?爲什麼?

我希望這有些幫助。再次,我建議你在掌握基本的語言概念之前(儘管它比許多其他技術更加棘手),然後再擔心調整數組大小的邏輯 - 可能從一個非常簡單的具有固定大小數組的類開始,從那裏前進。

+0

原始問題存在很多錯誤,如果沒有任何代碼強制模板編譯,那麼編譯器可能還沒有生成這些錯誤。雖然OP有很好的起點。 – Chad 2012-02-10 22:33:33

+0

這是我到目前爲止。我在我的一個整數數組的主體中設置了一個測試。從我可以告訴我,我的插入和刪除方法的工作。我對isEmpty有困難。即使數組點中只有零,它也會返回它不爲空。任何想法如何解決這個問題?我將我的新代碼添加到原始問題中。 – user1202950 2012-02-12 19:15:27

+0

推測'm_size'沒有降到0,可能是因爲它開始非零,所以如果你添加5個項目並再次刪除它,它只能回到它開始的位置?我認爲這裏的根本問題是,你需要跟蹤已分配數組的大小(通過insert()或其他)。它看起來像你在混淆兩者。 – Peter 2012-02-15 23:05:32