2016-08-01 2 views
0

인덱스 연산자 ([])를 오버로드하는 클래스에서 작업하고 있습니다. 요소의 할당을 허용하려면 연산자가 요소에 대한 참조를 반환해야합니다. 예를 들면 다음과 같습니다.STL 오버로드 벡터 할당

이 경우 클라이언트 코드는 반환 된 참조를 사용하여 요소에 값을 할당 할 수 있습니다. 그러나 일부 내부 정리 작업을 수행 할 수 있도록 할당 된 값을 사용할 수 있도록 요소의 실제 할당을 가로채는 방법이 필요합니다. 이 작업을 비교적 간단하고 간단하게 수행 할 수있는 방법이 있습니까? 아니면 연산자 오버로딩 대신 일부 접근 자 함수를 만들어야합니까?

+5

왜 당신은'std :: vector'에서 상속 받고 있는지 묻습니다. – PaulMcKenzie

+0

가상 소멸자를 제공하지 않는 클래스에서 상속하지 마십시오. 적어도 당신이하는 일을 정말로 아는 한! –

+0

예제를 단순화하기 위해 std :: vector를 사용했습니다. 나의 실제 수업은지도를 사용합니다. 구현하고자하는 것은 양방향 매핑입니다. 선형 검색을 사용하지 않고 조회 값으로 만 키를 가져 오는 효율적인 방법이 필요합니다. 역방향 매핑을 유지하기 위해 다른 벡터/맵을 사용할 계획이지만 할당 된 값을 캡처 할 수는 없습니다. 이제 할당을 캡처하기 위해 새 클래스를 정의하는 것보다 getter/setter를 사용하는 것이 더 나을 것 같습니다. 클래스의 값을 래핑하는 또 다른 문제는 인덱스가 아니라 값을 캡처한다는 것입니다. –

답변

1

AFAIK std :: vector 인덱스 연산자는 이미 항목 (const 또는 non-const)에 대한 참조를 반환하므로 상속하거나 재정의 할 필요가 없습니다.

값의 할당을 가로 채려면 올바른 값 지정 연산자 (벡터 인덱스 연산자에서 수행 할 수 없음)를 정의하거나 재정의하는 것이 올바른 방법입니다. 물론 순수한 int에서는 작동하지 않으므로 할당 연산자를 제공 할 클래스에 int를 래핑해야합니다. 그러면 원하는 모든 것을 수행 할 수 있습니다.

편집 : 나는, 그래서 다음 일부 재정의를 할 필요가 수 있습니다 참조

좋아. 역방향 조회의 경우 역 구조에 값을 저장하지 않고 원래 위치로 포인터를 저장할 수 있습니다. 원래 구조의 값 할당은 포인터 재 지정과 함께 반영됩니다. 또한 포인터를 비교하지 않고 역방향 조회 맵에 사용자 정의 비교 연산자를 전달해야하지만 값은 필요합니다.

일반적으로 boost::multi_index을 확인하는 것이 좋습니다. 정확하게 수행 할 수 있습니다. 여러 조회 색인이있는 단일 구조를 만듭니다.

+0

설명을 위해 필자가 수행해야하는 "정리"는 역방향 조회를 수행하는 데 사용할 수있는 보조 데이터 구조를 유지하는 것입니다. 즉, 선형 검색을 사용하지 않고 값에서 인덱스를 효율적으로 검색하는 데 사용할 수 있습니다. 클래스에서 값 할당을 배치하면 값에 액세스 할 수 있지만 키에는 액세스 할 수 없으므로 해당 값도 사용할 수 없습니다. –

1

정수 할당을 가로채는 방법이 없습니다. 그러나 대신 할당 연산자가 오버로드 된 사용자 정의 유형에 대한 참조를 반환 할 수 있습니다. 사용자 정의 유형은 int로 변환하여 하나로서 사용할 수 있습니다.

물론 이것은 int에 대한 참조를 반환하는 std::vector<int>을 상속받을 수 없음을 의미합니다. 어쨌든 std::vector을 공개적으로 상속하지 않아야합니다. 클래스 사용자가 정의되지 않은 동작이있는 std::vector<int>*을 통해 실수로 개체를 삭제할 수 있습니다.