0

如何在构造函数中为 2D 数组分配动态内存,同时保持我std::unique_ptr处理它的释放?还是有更好的方法来做到这一点?

我的错误是“高度不是一个常数表达式”。

#include <iostream>
#include <vector>
#include <memory>

template<typename T>
class Matrix
{
    private:
        int Width, Height;
        std::unique_ptr<T*> Elements;

    public:
        Matrix(int Width, int Height);

        T* operator[](int Index);
        const T* operator[](int Index) const;
};

template<typename T>
Matrix<T>::Matrix(int Width, int Height) : Width(Width), Height(Height), Elements(new T[Width][Height]) {}

template<typename T>
T* Matrix<T>::operator[](int Index) {return Elements[Index];}


int main()
{
    Matrix<int> M(4, 4);
    std::cout << M[2][2];
}
4

2 回答 2

2

您需要使用动态数组习语。分配一维向量并平移坐标。类似的东西: , Elements( new T[Width*Height] )。然后你需要在你的 operator[] 中进行数组转换,如下所示:return Elements.get()+Index*Height;

顺便说一句,您的unique_ptr应该是unique_ptr<T[]>而不是T*. 如果您分配 using new[],则需要 aunique_ptr<...[]>以确保它被 using 回收delete[]

于 2013-06-07T00:59:57.130 回答
1

函数参数不能用于初始化 C 数组,因为它们的值在编译时不一定是已知的。此外,像你这样进行动态分配的矩阵类也不是一个好主意......我建议将维度作为矩阵类模板的一部分,就像这样

template<typename T, size_t Width, size_t Height>
class Matrix
{
    private:
        std::array<std::array<T, Height>, Width> Elements;

    public:
        Matrix() {}

        std::array<T, Height> & operator[](int Index) { return Elements[Index]; }
};

所有数据都在堆栈上,因此您无需担心破坏。我std::array在这里使用,但在实际代码Vector中通常使用一个类。

对常用的矩阵类型使用 typedef

typedef Matrix<float, 2, 2> Mat2x2;
typedef Matrix<float, 3, 3> Mat3x3;
于 2013-06-07T01:06:43.730 回答