这个问题的答案应该是什么?

时间:2019-07-03 13:45:54

标签: c++ arrays class templates definition

注意: 我从我的一个朋友那里得到了这个问题。它是在面试中给他的。在大学的初期,我曾用C ++进行过编程。尽管乍一看这个问题看起来很简单,但我找不到很好的答案。这就是为什么我在这里问。

鉴于下面的C ++代码,请回答以下3个问题:

  • 班上应该做什么?
  • 该课程的实施存在一个主要问题。你能命名吗?
  • 您能否提供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;
    };

3 个答案:

答案 0 :(得分:1)

  1. 此类封装任何类型的值的数组。类似于RAII [See Here}
  2. 没有复制语义。
  3. 解决此问题的方法

    • 使用std::vector
    • 实施“三个规则” /“五个规则” /“零规则” [See Here]
    • 在构造数组后启用更改数组大小的功能。
    • 通过nullptr初始化
    • 使用std::sizesize_t代替整数,
    • 更改使用size时可能与std::size冲突的变量using namespace std的名称。
    • 使用if(data) delete[] data;初始化值时,用delete[] data;替换nullptr
    • std::out_of_rangegetValuesetValue的抛出

回答者:BethshebaSlavaJesper JuhlVlad from Moscow eerorika

答案 1 :(得分:1)

  

该班应该做什么?

这个问题不能通过阅读程序来确定。只有作者才能确定他们的意图。没有文档,至多我们只能猜测。

我的猜测:这是在RAII容器中封装动态数组分配的尝试。 std::vector的有限版本。

  

该课程的实施存在一个主要问题。你能命名吗?

这里有几个问题;一些比其他更重要。以下大致是按主要问题的顺序排列,最后按次要问题的顺序排列:

  • 该类是可复制且可移动的,但是复制和移动会导致未定义的行为。
  • 没有简单的方法来知道getValue是否返回值初始化的对象,因为这是索引处的值,或者因为索引超出范围。
  • 它不适用于仅移动元素。
  • 它不能与不可默认构造的元素一起使用。
  • 它不提供迭代器,因此不能与标准算法一起使用。
  • 析构函数中的
  • if(data)是多余的。
  

您能否给出3种不同的方法来解决此问题(取决于该类的要求规范)?

我假设我提到的第一个问题就是他们所提到的问题。

  • 删除复制/移动任务/构造函数。 (不一定理想,因为复制和移动可能是有用的操作。)
  • 或以不会导致不确定行为的方式实施它们。特别是,必须有一个类不变,即单个实例具有指向数组的唯一所有权。
  • 或使用std::vector代替。这也解决了所有小问题。

答案 2 :(得分:1)

我想附加 @Arshad 的答案。

对于初学者,数组的大小应为size_t类型。

成员函数setValuegetValue应该抛出异常std::out_of_range

getValueconst对象应重载函数non-const,并相应地将constnon-const reference返回到数组的元素。

最好还声明operator []

最好初始化数组

data = new T[size] {};

该类还应具有一个名为size()的成员函数,该成员函数返回数组中的元素数。否则,该类的用户将无法正确指定索引。

我认为也应该提及该类的迭代器。:)否则该类不是很有用,不能与标准算法一起使用,例如std::fill。:)