注意: 我从我的一个朋友那里得到了这个问题。它是在面试中给他的。在大学的初期,我曾用C ++进行过编程。尽管乍一看这个问题看起来很简单,但我找不到很好的答案。这就是为什么我在这里问。
鉴于下面的C ++代码,请回答以下3个问题:
template<typename T>
class Array
{
public:
Array(unsigned arraySize):
data(0), size(arraySize)
{
if(size > 0)
data = new T[size];
}
~Array()
{
if(data) delete[] data;
}
void setValue(unsigned index, const T& value)
{
if(index < size)
data[index] = value;
}
T getValue(unsigned index) const
{
if(index < size)
return data[index];
else
return T();
}
private:
T* data;
unsigned size;
};
答案 0 :(得分:1)
RAII
[See Here} 解决此问题的方法
std::vector
nullptr
初始化std::size
或size_t
代替整数,size
时可能与std::size
冲突的变量using namespace std
的名称。if(data) delete[] data;
初始化值时,用delete[] data;
替换nullptr
。std::out_of_range
和getValue
中setValue
的抛出答案 1 :(得分:1)
该班应该做什么?
这个问题不能通过阅读程序来确定。只有作者才能确定他们的意图。没有文档,至多我们只能猜测。
我的猜测:这是在RAII容器中封装动态数组分配的尝试。 std::vector
的有限版本。
该课程的实施存在一个主要问题。你能命名吗?
这里有几个问题;一些比其他更重要。以下大致是按主要问题的顺序排列,最后按次要问题的顺序排列:
getValue
是否返回值初始化的对象,因为这是索引处的值,或者因为索引超出范围。if(data)
是多余的。您能否给出3种不同的方法来解决此问题(取决于该类的要求规范)?
我假设我提到的第一个问题就是他们所提到的问题。
std::vector
代替。这也解决了所有小问题。答案 2 :(得分:1)
我想附加 @Arshad 的答案。
对于初学者,数组的大小应为size_t
类型。
成员函数setValue
和getValue
应该抛出异常std::out_of_range
。
getValue
和const
对象应重载函数non-const
,并相应地将const
或non-const reference
返回到数组的元素。
最好还声明operator []
。
最好初始化数组
data = new T[size] {};
该类还应具有一个名为size()
的成员函数,该成员函数返回数组中的元素数。否则,该类的用户将无法正确指定索引。
我认为也应该提及该类的迭代器。:)否则该类不是很有用,不能与标准算法一起使用,例如std::fill
。:)