在我的基本向量类中使用数组作为模板参数

Tid*_*ddo -1 c++ arrays templates vector

来自PHP背景,我正在尝试学习C++,因为我发现它是一种有趣的语言.作为一种练习,我想使用模板创建一个简单的Vector类,这并不难.但是,我遇到了一个问题.

我创建了以下模板类:

template <typename T>
class Vector
{
public:
    Vector(int length);
    ~Vector(void);
    int getLength();

    T& operator[] (const int index);

private:
    T *_items;
    int _count;
};


template <typename T>
Vector<T>::Vector(int length)
{
    _items = new T[length];
    _count = length;
}

template <typename T>
T& Vector<T>::operator[]( const int index )
{
    if (index >= getLength() || index < 0)
        throw exception("Array out of bounds.");
    return _items[index];
}
Run Code Online (Sandbox Code Playgroud)

所有功能都已实现,但它们与我的问题无关,所以我没有在这里复制它们.

这个类按预期工作,但有一个例外:如果我想创建一个数组向量,它就不起作用.例如:

Vector<int[2]> someVector(5);
Run Code Online (Sandbox Code Playgroud)

我显然想要的是,vector类的_items属性将是一个int [5] [2].但是,由于编译器用'int [2]'替换'T',_items属性将是int [2] [5](或者至少,这是我从调试中理解的,如果我错了请纠正我).结果,[]运算符不再正常工作,因此整个类对于数组来说是无用的.

有没有办法解决这个问题,所以这个类也适用于数组?如果那是不可能的,有没有办法阻止这个类用数组初始化?

编辑:感谢您到目前为止的所有回复.但是,我的问题可能并不完全清楚.首先,我创建了这个类来习惯c ++,我知道有一个std :: vector类,我现在也更好地使用向量向量.那不是问题所在.我只想更好地理解模板,一般来说是c ++,所以我想知道如何处理这类问题.我希望能够创建不会导致程序崩溃的类.如果我或其他人现在会使用这个类并尝试使用原始数组而不是这个类的向量,那么程序会因为数组错误而崩溃(Vector(y)变为int [x] [y ]而不是int [y] [x]内部).所以我想要一个解决方案,它可以创建正确的数组,也可以防止矢量被数组初始化.

Pup*_*ppy 7

很简单,不要使用内置的原始数组.为了任何东西.他们非常糟糕.总是使用类包装器boost::array,如果你没有TR1或C++ 0x,它们都提供了一个array类.一个Vector<boost::array<int, 2>>简单的编译.

为什么不使用原始数组?

他们对指针进行了可怕的隐式转换,忘记了他们的大小,不是一等公民(例如,不能分配给他们),例如,不检查他们的界限.boost::array<int, 2>是一个原始的数组没有蹩脚的转换,是完全通用的 - 例如,你的矢量模板与boost::array<int, 2>蝙蝠一起正常工作,它可以在at()函数中进行边界检查.

我并不是建议使用动态数组.boost::array不是动态大小的数组.它是一个恒定大小,值类型阵列,这不会转换为指针,它具有功能的标准库中使用等begin,end,size,并且它可以像任何其他类型-处理不同于阵列,其具有一打特殊规则 - 你已经发现了.


And*_*sen 5

我看到了一些错误.

  1. 如果你正在制作一个通用的矢量类,为什么要处理数组矢量而不是矢量矢量?

而不是定义int [2]类型的向量,尝试用这样的东西制作大小为2的向量的向量:

Vector<Vector<int>> vector(5);
for (int i = 0; i < 5; i++)
{
    vector[i] = Vector<int>(2);
}
Run Code Online (Sandbox Code Playgroud)
  1. 不要使用常量大小的数组,而是尝试使用指针.

而不是使用指向大小为2的数组的指针,使用指向指针的指针,并为该指针分配两个空格.指针在C++中处理起来要容易得多,因为你只需传递指针的地址而不必复制整个数组.传递数组通常是非常糟糕的形式.

  1. 向构造函数添加默认参数

Vector(int length);尝试使用,而不是声明构造函数Vector(int length = 0);,如果用户没有指定长度,它将默认为零.

最后,您是否意识到实际上存在std :: vector,或者您是否意识到这一点并且只是尝试复制它?众所周知,模板是C++最难的主题之一,祝你好运!