【发布时间】:2015-06-29 09:12:47
【问题描述】:
我最近遇到了一个 C++ 招聘测试。他们提出以下 4 个问题。
- 在实现中至少有 4 个不同的错误 下面的数组类。
- 为每个错误至少为其中 2 人提供一个测试用例。
- 为每个错误提出修复建议
- 假设我们有一个没有错误的 Array 类实现,你认为 有什么设计问题吗?
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 ( nothrow) 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();
}
};
问题是我看不到任何错误。 是的,有一些奇怪的代码,例如:
- 调用删除前检查
- 越界时在 Get 中返回默认值
- 使用删除而不是删除 []
但这些对我来说不是错误。
【问题讨论】:
-
(1)
delete m_pData;应该是delete [] m_pData; -
看看你的构造函数。如果
m_nSize == 0会发生什么?m_pData指针将设置为什么?此外,在发出delete时无需测试 NULL。代码存在错误和样式问题。 -
没有复制构造函数或赋值运算符。
-
如果
new (nothrow)返回 nullptr 会怎样? -
默认构造一个
T来返回一个越界的Get似乎很荒谬。