2014-09-24 2 views
0

빠른 질문, 제가이 주제를 Google로 볼 때 유일한 사실은 사람들이 프록시를 사용하는 것이 최선이라고 말하는 것입니다. 실행 가능한 포인터를 반환하지 않는 이유는 무엇입니까?다차원 subscripting, 왜 포인터를 통해 프록시를 사용합니까?

예제!

class example{ 
private: 

int** arr; 

public: 
    int* operator[](const int index) { 
     return arr[index]; 
    } 
}; 

우리는 단지

cout << example[0][0]; 
5 

를 호출 시도하고 나는 문제가 프록시 클래스를 생성하고 proxys 연산자 []를 호출을 통해 이동해야하는 이유는 배열에 한 번 더 "깊이"에 도달, 일 ?

+0

글쎄, 왜 처음에'int **'대신에 클래스가 필요할까요? 'example [0] [0]'은'int ** '에서도 작동 할 것입니다. – iavr

+1

일반적으로 포인터는 포인터에 대한 포인터를 통해 데이터에 액세스 할 수 없으므로 프록시가 "필요"합니다. 하지만 대부분의 경우에는 어쨌든'[x] [y] '액세스가 필요하지 않습니다. – juanchopanza

+0

클래스는 행렬 곱셈, 회전 투영법 등을 수행 할 수있는 Matrix 클래스입니다. 방금 예제 클래스를 만들었습니다! –

답변

0

보통 두 번째 하위 스크립트에 대한 프록시를 쓰거나 의견에서 제안한 일부 사람들이 대신 클래스를 사용하므로 하위 스크립트보다 많은 작업에 유용합니다.

즉, 고전적인 양방향 배열 또는 포인터 대 첨자 sintaxes를 resesble하기 때문에 프록시 접근 방식을 좋아합니다. 그러나 이 (읽기 쉽고 간단하고 효율적인) 최상의 대안입니까? 잘 모르겠습니다. N 차원 첨자

class matrix 
{ 
public: 
    int operator()(std::size_t row , std::size_t column) const 
    { 
     return _matrix[row][column]; 
    } 
}; 

이 너무 많은 대수 라이브러리를 사용하는 꽤 알려진 기술이기 과부하 operator() :

훨씬 간단한 대안이있다. 완전 일반 (n 차원) 라이브러리의 경우 프록시의 연속보다 더 적합하다고 생각합니다 ([][][][][]...). 또한 variadic 템플릿을 사용하여 실제 n 차원 일반 첨자 연산자를 작성하는 것이 더 쉽습니다.

+0

나는'operator()'가 훨씬 쉽다는 것에 동의한다. 또한'operator []'와 튜플을 고려하십시오. –

관련 문제