我有功课要做,但我不熟悉课堂模板。
任务是:
以下课程的实施存在一个主要问题。你能发现它吗?你怎么解决 问题?根据需求规格,您可以提出多种解决方案 上课。
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 :(得分:2)
答案 1 :(得分:1)
在构造函数中:if
没有else
。考虑后果。
确保new []与delete []匹配,new与delete匹配
这违反了规则3(或5与C ++ 0x)
这就是我所看到的。
答案 2 :(得分:1)
没有复制构造函数或赋值运算符。此代码会很快崩溃您的程序。这是主要的缺陷。
将析构函数设为虚拟是一个奇怪的决定。从这个课程中得出没有明显的需要或好处。
我也会实现一个交换方法。
答案 3 :(得分:0)
get
函数返回无效索引的值。如果type T
为int
s,而您使用的get
索引过大,则得到的答案为0.如果值为0,该怎么办?您如何区分0
值与无效索引值之间的区别?
还有一些额外的代码:您不需要else return