2013-06-24 5 views
2

C++에서 인덱스 작업 []을 덮어 쓰고 배열과 같은 클래스 내부 데이터로 작업 할 수 있다는 것을 알고 있습니다. [] []를 덮어 쓰고 두 개의 디멘션 배열과 같이 작동 할 수 있습니까?인덱스 작업 덮어 쓰기

답변

3

예, 가능합니다 (std :: vector는 이러한 클래스의 예입니다).

클래스 또는 구조에서 연산자 []을 (를) 오버로드해야합니다.

RETURN_TYPE operator[] (size_type n); 

UPD :

이 경우에는 가능한 서명 것 인덱스 데이터 양의 정수를 사용하면 키와 음이 아닌 정수가 벡터의 벡터를 사용하여 2 차원 데이터 구조체를 원한다면 :

std::vector<std::vector<YOUR_TYPE>> vector_name; 
+0

수행 방법에 대한 예제가 있습니까? 하지만 std :: vector는 2 차원이 아닙니다 – user1913557

+0

위 업데이트로보기 –

0

예, 실제로 가능합니다. 일반적으로, 오버로드 []는 행 유형 객체에 대한 참조를 반환하고 해당 행 유형 객체에 대한 []를 오버로드하여 스칼라에 대한 참조를 생성합니다.

[x]*(... + x)의 등가성을 유지하려면 포인터 역 참조 오버로드도 고려해야합니다.

+0

두 번째 제안은 실제로 문제의 클래스 종류에 따라 다릅니다. 나는 상상할 수 없다. std :: vector v (100); * (v + 7) = 5;는 합법적 인 코드입니다. – Angew

+0

@Angew; 과연. 그러므로 고려할 필요가있다. 만약 당신이 매트릭스 클래스를 작성했다면 나는해야한다고 생각합니다. – Bathsheba

0

의 당신이 exemple에 대한 arr[x][y]를 ACESS 할 때마다 방금 [] 과부하 그래서 그렇게 먼저 arr[x](arr[x])[y]의 등가를 가지고 (의이 a 이름을하자) 평가 후 a[y]이 평가 배열 arr 있다고 가정 해 봅시다 운영자.

+0

하지만 (arr [x]) - 1 차원 배열을 반환해야하고 [y] - 값을 사용하면 한 연산자에 두 가지 다른 반환 유형을 오버로드하는 방법은 무엇입니까? – user1913557

+0

@ user1913557 배열? Nop. 포인터를 반환합니다. '[]'연산자의 왼쪽은 항상 포인터입니다. –

1

달성하려면 operator[]에 오버로드하여 operator[]이있는 개체를 반환해야합니다. 예 :

class Proxy { 
    std::vector<int>::iterator it; 
    //constructor; 
    int operator[] (size_t pos) { 
     return *(it + pos); 
    } 
} 

class MyMatrix { 
    std::vector<std::vector<int>> v; 
    Proxy operator[] (size_t pos) { 
     return Proxy(v[pos].begin()); 
    } 

} 
+1

경계 검사를 수행하지 않고 단일 치수 구현을 사용하는 경우 포인터는 적절한 'Proxy'입니다. int * operator [] (int i) {return & v [i * columns]; }'. 비슷하게 구현시,'std :: vector &'가 적당한 프록시이다. –