2011-08-15 79 views
1

我有作業要做,但我沒有非常熟悉類模板。類模板的問題

的任務是:

有一個在下面的類執行的主要問題。你能發現它嗎?你怎麼能修復 的問題?您可以提出多個解決方案,具體取決於該類別的要求規格 。

template <class T> 
class Array 
{ 
private: 
    T *m_pData; 
    unsigned int m_nSize; 

public: 
    Array(unsigned int nSize) : m_nSize(nSize) 
    { 
    if(m_nSize > 0) 
     m_pData = new T[m_nSize]; 
    } 

virtual ~Array() 
    { 
    if(m_pData != NULL) 
     delete m_pData; 
    } 
bool Set(unsigned int nPos, const T& Value) 
    { 
    if(nPos < m_nSize) 
    { 
     m_pData[nPos] = Value; 
     return true; 
    } 
    else 
     return false; 
    } 

    T Get(unsigned int nPos) 
    { 
    if(nPos < m_nSize) 
     return m_pData[nPos]; 
    else 
     return T(); 
    } 
}; 

至於我而言是有內存泄漏。你發現一些其他問題嗎?提示比確切的答案更受歡迎;)

+0

沒有內存泄漏(因爲內存是由析構函數釋放的),但你正在考慮沿着正確的線。順便說一下,至少有三個主要問題。 –

回答

1

在構造函數中:有一個if沒有else。考慮後果。
確保new []與delete []匹配,並使用delete刪除。
這違反了3(或5與C++ 0x)規則

這就是我看到的。

+0

如果這只是作業,我懷疑C++ 0x的問題會出現 – calccrypto

2
  1. 構造函數 - 你需要設置m_pData的值n大小的爲0
  2. 所以,如果在析構函數不需要語句可以刪除空指針的事件。刪除要刪除[]
+0

哇,刪除之前的檢查在我的工作場所很常見,我從未注意到。這是一個微不足道的表現,而不是一個錯誤,但是問題問的是「問題」,所以我猜它很重要。 –

0

繼承人的幾件事情,但我懷疑任何人都嚴重,足以成爲正確答案:

  1. get函數返回無效索引值。如果type Tint s,而您使用get的索引太大,那麼您得到的答案將爲0.如果值可以爲0,該怎麼辦?你怎麼知道0值與無效索引值之間的差異?

  2. 有一些額外的代碼:你不需要的else return

+0

對,get應該爲邊界錯誤拋出異常。 –

1

有沒有拷貝構造函數或賦值操作符。這段代碼會很快崩潰你的程序。這是主要缺陷。

讓析構函數變爲虛擬是一個奇怪的決定。沒有明顯的需要或者從這個課程中獲益。

我也會實現交換方法。

+0

'提出多個解決方案',這顯然是指實現複製構造函數和賦值運算符的正確解決方案,或者指向私有聲明的懶惰解決方案。 – john