2013-06-07 6 views
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]; 
} 

답변

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 Matrix<float, 2, 2> Mat2x2; 
typedef Matrix<float, 3, 3> Mat3x3; 
+0

그래,하지만 사용자가 하나의 행 크기를 조정하고 .. 다른 사람을 떠나하기로 결정 그래서 일반 배열을 사용하는 경우 벡터가 이상한 행렬을 각 행을 추적함으로써 수 있습니다 : 디 – Brandon

2

동적 배열 관용구를 사용해야합니다. 1 차원 벡터를 할당하고 좌표를 변환합니다. 다음과 같음 : , Elements(new T[Width*Height]). 그럼 당신은이처럼 연산자 [], 뭔가 배열 변환을 수행해야합니다 :

return Elements.get()+Index*Height;이 덧붙여, 당신의 unique_ptrunique_ptr<T[]>보다는 T*해야한다. new[]을 사용하여 할당하는 경우 delete[]을 사용하여 교정하기 위해 unique_ptr<...[]>이 필요합니다.

관련 문제