2011-08-15 49 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