문제

내 데이터 structs 클래스에 해시 테이블을 작성하고 있으며 구현에 약간의 구문 설탕을 추가하고 싶습니다.

template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
  return items.lookup(key);
}

cout << dict [ "mykey"]와 같은 일을 할 때는 잘 작동합니다. 그러나 괄호로 어떻게 할 수 있습니까? 같은 것 :

dict["mykey"] = "something";

그리고 아니, 이것은 내 숙제 과제의 일부가 아니며 (말장난 의도가 없음) C ++를 조금 더 배우고 싶습니다.

도움이 되었습니까?

해결책

당신이 정확히 무엇을 묻는지는 확실하지 않습니다. 당신이 제시 한 코드는 이미 과제를 지원합니다. 그냥 해보고 의지가 작동합니다 (또는 적어도 컴파일해야합니다). 과부하가 걸린 할당 연산자의 어느 쪽이 절대적으로 차이가 없습니다. [] 사용됩니다. 과제의 오른쪽 (또는 오페라)에서와 같은 왼쪽 (LHS)에서 정확히 같은 방식으로 작동합니다. <<, 원래 게시물에서와 같이). 당신의 [] an에 대한 참조를 반환합니다 Object, 그런 다음 실제 과제는 귀하의 과제 연산자가 처리합니다. Object 유형, 의미를 의미합니다 [] 그 자체는 실제로 실제 과제에 관여하지 않습니다.

여기서 진짜 질문은 당신이 원하는 방법입니다 [] 특별한 경우에 행동합니다. 테이블에 키가 없으면 어떻게 될까요? 무엇에 대한 참조 Object 너의 lookup 이 경우 돌아올까요?

당신이 게시 한 내용을 알아내는 것은 불가능합니다. 나는 그것이 참조를 반환하는 것을 본다 NULL 의문의 여지가 없습니다. 새롭고 비어있는 것을 삽입합니까? Object 주어진 키를 위해? 그렇다면 아무것도 할 필요가 없습니다. 당신의 [] Assigment의 LHS에서 이미 완벽하게 사용할 준비가되었습니다. (이것은 방법입니다 [] 안에 std::map 작품, btw)

당신의 경우에 lookup 특별한 "가드"에 대한 참조를 반환합니다. Object, 당신은 특별한 조치를 취해야합니다. 당신은 아마도 "가드"객체에 아무것도 할당하고 싶지 않으므로 할당 연산자를 "비활성화"해야합니다. 나머지는 그대로 작동해야합니다.

당신의 경우 lookup 존재하지 않는 키의 경우 예외를 던지면 이것이 당신이 원하는지 여부를 결정해야합니다. [] 과제의 LHS에서 사용됩니다. 그렇다면 아무것도 할 필요가 없습니다. 그렇지 않다면 추가 작업이 필요합니다 ...

다시, 당신이 존재하지 않는 열쇠를 lookup?

추신 : 또한 일반적으로 선언하는 것이 더 합리적입니다. [] (그리고 lookup) 어느 쪽이든 const HashedObj& 매개 변수 또는 그냥 HashedObj 매개 변수. 당신의 예에서와 같이, 불가능한 참조는 이상하게 보이며 일부 (실제로는 대부분)의 경우 문제를 일으킬 수 있습니다. 지금 당신을 위해 작동하는 것이 놀랍습니다 ...

다른 팁

2 번 과부하해야합니다. 하나가 될 것입니다 const,, 그것은 될 것입니다 data access 부분, 그리고 참조를 반환하는 것은 "세터"역할을합니다.

당신이 찾고있는 것은 과부하 된 브래킷 연산자와 유사한 기능입니다. std::map. ~ 안에 std::map 브래킷 연산자는 조회를 수행하고 특정 키와 관련된 객체에 대한 참조를 반환합니다. 맵에 키와 관련된 객체가 포함되어 있지 않으면 연산자는 기본 생성자를 사용하여 새 개체를 맵에 삽입합니다.

그래서, 당신이 있다면 std::map<K,V> mymap, 그런 다음 전화 mymap[someKey] 관련 값에 대한 참조를 반환합니다. someKey, 그렇지 않으면 새로운 유형의 객체를 만듭니다. V 전화로 V() (V의 기본 생성자) 그런 다음 해당 새 개체에 대한 참조를 반환하여 발신자가 객체에 값을 할당 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top