2013-06-01 1 views
-1

할당을 위해 일부 코드를 작업 해 왔으며 중첩 된 템플릿 유형에 문제가 있습니다.다차원 배열 구현

는 I 3 개 소자 어레이의 3 소자 어레이 생성하기 위해 다음 코드가 필요 (일종의 INT의 B 등 [3] [3]) 여기서 Array< Array<int> > b(3);

내 어레이의 중요한 부분이다 .H :

template <class T> 
class Array{ 
    public: 
    Array() : size(0){ data = NULL; } 

    Array(int s) : size(s) { data = new T[size]; } 

    Array(const Array & a) : size(a.length()) { 
     data = new T[a.length()]; 
     for(int i = 0; i < a.length(); ++i) 
     data[i] = a[i]; 
    } 

~Array(){ delete[] data; } 

T & operator[](int i) { 
    if (i >= 0 && i < size){ 
     return data[i]; 
    } else { 
     throw ArrayOutOfBounds(i); 
    } 
} 

T operator[](int i) const{ 
    if (i >= 0 && i < size){ 
     return data[i]; 
    } else { 
     throw ArrayOutOfBounds(i); 
    } 
} 

Array<T> & operator=(const Array<T> &a){ 
    if(this == &a) return *this; 
    delete[] data; 
    data = new T[a.length()]; 
    for(int i = 0; i < a.length(); ++i) 
     data[i] = a[i]; 
    size = a.length(); 
} 

    int length() const { return size; } 

    // Members 

    private: 
    int size; 
    T * data; 
} 

업데이트 6/1 전체 드라이버 코드 :

// Test driver for generic Array object with assignment and bounds checking 

    #include "Array.h" 

int main() { 
    Array<int> a1(10); 
for (int i = 0; i < a1.length(); ++i) 
     a1[i] = i * i; 
Array<int> a2 = a1; 
try { 
    for (int i = 0; i <= a2.length(); ++i) 
     cout << a2[i] << " "; 
    cout << endl; 
} 
catch (const ArrayOutOfBounds & e) { 
    cout << endl << "ArrayOutOfBounds index=" << e.index << endl; 
} 
Array< Array<int> > b(3); 
for (int i = 0; i < b.length(); ++i) { 
    for (int j = 0; j < b[i].length(); ++j) 
     b[i][j] = i*b[i].length() + j; 
} 
for (int i = 0; i < b.length(); ++i) { 
    cout << "b[" << i << "]= "; 
    for (int j = 0; j < b[i].length(); ++j) 
     cout << b[i][j] << " "; 
    cout << endl; 
} 

Array<const char *> c(3); 
c[0] = "moe"; c[1] = "curly"; c[2] = "larry"; 
Array<const char *> d(10); 
d = c; 
for (int i = 0; i < d.length(); ++i) 
    cout << "d[" << i << "]=" << d[i] << " "; 
cout << endl; 

return 0; 
}  

예상 출력 :

Array<T> & resize(int newsize){ 
    delete[] data; 
    data = new T[newsize]; 
    size = newsize; 
    for(int i = 0; i < size; ++i) 
     init(data[i], size); 
} 

재귀 크기 조정은 더 높은 차원 작동, 같은 :

0 1 4 9 16 25 36 49 64 81 
ArrayOutOfBounds index=10 
b[0]= 0 1 2 
b[1]= 3 4 5 
b[2]= 6 7 8 
d[0]=moe d[1]=curly d[2]=larry 

업데이트 6/2

당 기욤의 솔루션은, 여기 내가 사용하는 크기 조정 방법 as Array< Array< Array<int> > > q(3);

+0

초기화되지 않은 포인터에서 아마도'delete []'를 호출 할 것입니다. – chris

+0

최소한 두 번째 차원을 생성자에 전달하는 방법을 계획해야합니다. – BlueWanderer

+0

[Ideone에서 코드가 충돌하지 않습니다] (http://ideone.com/9cOHRT). – djf

답변

2

코드에 따르면, 붙여 넣기를하면 충돌이 발생하지 않아야합니다. 소멸자를 잊었 니? 메모리를 삭제하는 소멸자가 있어야합니다. 데이터를 가지고있을 때 데이터가 nullptr (또는 NULL)로 초기화되어 빈 배열을 삭제할 때 충돌이 발생하지 않도록해야합니다.

그러나 귀하의 접근 방식은 혼란 스럽습니다. 배열 크기는 런타임 또는 컴파일 타임에 결정됩니까? int b[3][3]은 컴파일 타임에 결정됩니다. 당신이 것을 원하는 경우에, 당신은 당신의 크기를 결정하는 크기 조정 방법이 필요합니다, 당신은 런타임에 크기를 detemrine하려면 http://en.cppreference.com/w/cpp/container/array

를 참조 C++ 11 std::array 같은 크기를 템플릿 인수를해야한다 2 차원.

EDIT : 드라이버 코드에 따라 생성자에서 다른 것을해야합니다 (T가 배열 인 경우 int를 T에 전달). 상당히 솔직히 말하자면, 이것은 버그와 거의 같습니다.

private: 
template <typename U> 
void init(U&, int) {} 

template <typename U> 
void init(Array<U>& a, int sz) 
{ 
    a.resize(sz); 
} 

public: 
Array(int s) : size(s) { 
    data = new T[size]; 
    for (int i = 0 ; i < size; ++i) { 
     init(data[i], s); 
    } 
} 

그것은 작동하지만 이것이다 : 사양의이 종류는 정말 열심히 생성자가

내가 이런 걸 거라고 (배열을 제외하고 T를 모든 종류의 기본의 ctor를 호출)하는 일을 설명 할 수 있습니다 추한. C++ 11을 사용할 수 있다면, std :: enable_if를 사용하면 더 좋을 것입니다.

+0

아 그래, 세그 폴트의 원인은 초기화되지 않은 포인터였습니다. 드라이버 코드에 따라 런타임에서 크기를 결정해야한다고 생각합니다. resize 메서드는 합리적으로 들리지만 컨테이너 Array와 배열 요소를 인터페이스하는 데 문제가 있습니다. 템플릿 클래스의 typeid를 (int를받는 생성자에서) Array로 검사하여 일치하는지 확인한 다음 배열을 작성하려고합니다. 이것은 무식하고 문제가되는 것처럼 보입니다. 더 나은 방법을 알고 있습니까? – Cam

+0

@CameronJuarez 'T & operator [] (int i) {return data [i];를 추가하십시오. }'. 그런 다음 이것을 사용하여 (int i = 0; i <3; ++ i) {b [i] .resize (3); }' – Guillaume

+0

맞아요, 제가 가지고있는 것이지만 배열 요소를 배열 요소와 구분 짓는 방법은 무엇입니까? 예 : 'b [i] .resize (n)'는 b가 프리미티브의 배열 인 경우 이해가되지 않습니다. – Cam