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

動的配列イディオムを使用する必要があります。1 次元ベクトルを割り当て、座標を変換します。次のようなもの: , Elements( new T[Width*Height] ). 次に、次のように operator[] で配列変換を行う必要があります。return Elements.get()+Index*Height;

ちなみに、あなたはではなく でunique_ptrある必要があります。を使用して割り当てる場合は、 を使用して確実に回収されるようにする必要があります。unique_ptr<T[]>T*new[]unique_ptr<...[]>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 に答える