如何在C ++中为固定大小的数组类创建模板定义?

时间:2014-07-15 07:11:03

标签: c++ arrays templates

我需要创建一个模板,因为我不知道它是一个数组。它需要具有构造函数中传递的大小。所以这就是我得到的,我得到了各种各样的错误。我是C ++的初学者,所以感谢任何帮助:)

template <typename T, int N>
class Array
{
  public:
    T& operator[](int index)
    {
      return data[index];
    }
  private:
    int size;
    T *data[N];
};

我想你明白我在做什么。正如您所看到的,我还需要重载下标运算符。不确定我是否需要引用或指针或什么。我确实有一个构造函数,但它没有正常工作。

2 个答案:

答案 0 :(得分:0)

这是一个带有示例主要版本的更正版本:

#include <iostream>
using namespace std;

template <typename T, int N>
class Array
{
  public:
    T& operator[](int index)
    {
      // add check for array index out of bounds i.e. access within 0 to N-1
      return data[index];
    }
    Array() {
        data = new T[size = N];
    }
    ~Array() {
        if (data)
            delete [] data;
    }
  private:
    int size;
    T *data;
};

int main(void) {
    Array<int, 4> a;
    a[0] = 5;
    cout << a[0] << endl;
    return 0;
}

答案 1 :(得分:-1)

从我可以看到你的模板包含一个指针的数组,从我读的和你的[]运算符实现不是你打算做的。首先,您应该从

中删除 *
T *data[N];

您可能应该从构造函数初始化模板的大小,因此您应该更改:

T *data[N];

到:

T* data;

和:

template <typename T, int N>

到:

template<typename T>

现在稍微改变了实现,你现在应该写一个像这样的构造函数:

template<typename T>
Array(int n) {
    data = new T[n];
}

现在你还应该添加这样的析构函数:

~Array() {
    delete[] data;
}

然后你去:)

但是,如果你想将大小保持为模板的参数,你的构造函数就像:

template<typename T, int N>
Array() {
}

和数据声明:

T data[N];

正如评论中所说,你可能想在“现实生活”条件下使用std :: array,但作为一种训练,实现你自己的数组是一件好事,这毕竟是大多数计算机学校的培训。