类模板的问题

时间:2011-08-15 16:36:33

标签: c++ templates

我有功课要做,但我不熟悉课堂模板。

任务是:

  

以下课程的实施存在一个主要问题。你能发现它吗?你怎么解决   问题?根据需求规格,您可以提出多种解决方案   上课。

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

就我而言,存在内存泄漏。你发现了其他一些问题吗?提示比精确答案更受欢迎;)

4 个答案:

答案 0 :(得分:2)

  1. 构造函数 - 如果nSize为0,则需要设置m_pData的值
  2. 您可以删除空指针,因此析构函数中不需要if语句。删除应该是删除[]

答案 1 :(得分:1)

在构造函数中:if没有else。考虑后果。
确保new []与delete []匹配,new与delete匹配 这违反了规则3(或5与C ++ 0x)

这就是我所看到的。

答案 2 :(得分:1)

没有复制构造函数或赋值运算符。此代码会很快崩溃您的程序。这是主要的缺陷。

将析构函数设为虚拟是一个奇怪的决定。从这个课程中得出没有明显的需要或好处。

我也会实现一个交换方法。

答案 3 :(得分:0)

继承了一些事情,但我怀疑他们中的任何一个都是认真的答案:

  1. get函数返回无效索引的值。如果type Tint s,而您使用的get索引过大,则得到的答案为0.如果值为0,该怎么办?您如何区分0值与无效索引值之间的区别?

  2. 还有一些额外的代码:您不需要else return