2009-10-24 2 views
3

데이터 구조체 클래스에 대한 해시 테이블을 작성 중이며 구현에 구문 단설을 조금 추가하고 싶습니다. 내가 < < DICT [ "의 mykey"] cout과 같은 일을 할 때 잘 작동오버로드 브래킷 액세스 및 할당 C++

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

. 그러나 어떻게 대괄호로 대입 할 수 있습니까? 같은 뭔가 :

dict["mykey"] = "something"; 

그리고 아니, 이건 내 숙제 (의도 웃기), 난 그냥 조금 더 나은 C++를 배우고 싶은의 일부가 아닙니다.

+0

BTW, 당신은 문자열 키들과 함께 사용하기 위해 당신의'Dictionary'를 선언 할 때'HashedObj'로 사용합니까? 위의 예에서''mykey ''처럼. – AnT

+0

참조를 반환하기 때문에 대입 연산자는 예상대로 작동해야합니다. lookup()이 키를 찾지 못했을 때 유일한 문제가 발생했다. –

+0

제 테스트에서 저는 문자열을 사용합니다 : Dictionary dict; – Matt

답변

5

여기 정확히 묻는 것이 명확하지 않습니다. 이미 제시 한 코드는 할당을 지원합니다. 그냥하고 일할 때 (또는 적어도 컴파일해야합니다). 할당 연산자의 어느쪽에 오버로드 된 []이 사용되는지는 전혀 차이가 없습니다. 과제의 오른쪽 (RHS) (또는 원래 게시물의 <<의 피연산자)과 마찬가지로 왼쪽에서 (LHS)와 똑같은 방식으로 작동합니다. []Object에 대한 참조를 반환하고 실제 할당은 Object 유형의 할당 연산자로 처리됩니다. 즉 [] 자체가 실제 할당에 실제로 관여하지 않습니다.

여기 실제 질문은 특정 케이스에서 []의 행동을 원하는 방식입니다. 열쇠가 테이블에 없으면 어떻게 될까요? 이 경우 귀하의 lookup은 무엇이 Object에 대한 참조입니까?

게시 한 내용을 파악하는 것은 불가능합니다. 참조를 반환하므로 NULL을 반환하는 것은 문제가되지 않습니다. 주어진 키에 대해 새빈을 삽입합니까? 그렇다면 아무 것도 할 필요가 없습니다. []은 이미 완벽하게 LHS에서 사용할 준비가되었습니다. 경우

당신의 lookup 반환 특별한 "가드"Object에 대한 참조, 당신은 특별한 조치를 취할 필요가 (이 [] BTW std::map 작품에 어떻게). "보호"객체에 아무 것도 지정하지 않으려면 할당 연산자를 어떻게 든 "사용 불가능하게"설정해야합니다. 나머지는 그대로 작동해야합니다.

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

lookup에 존재하지 않는 키를 전달하면 어떻게됩니까?

P. 또한 일반적으로 (및 lookup)을 const HashedObj& 매개 변수 또는 HashedObj 매개 변수로 선언하는 것이 더 적합합니다. 예제에서와 같이 비 const 참조는 이상하게 보이고 일부 (실제로는 대부분의 경우)에서 문제를 일으킬 수 있습니다. 나는 그것이 당신을 위해 지금 일한다고 감히 ...

+0

이미 할당을 지원합니다. 나는 그것보다 더 어려울 것이라고 생각했다! 나는이 간단한 프로그램의 특별한 경우에 대해 너무 걱정하지 않지만, 그들을 지적 해 주셔서 감사합니다. – Matt

+0

나는 = 연산자를 통한 할당을 지원합니다. – Alexandru

+0

@Matt : 단지 100 % 클리어하기 위해서, operator []'는 Object 참조를 리턴합니다. 할당을 지원해야하는 것은'Object' 클래스입니다. 'Dictionary' 클래스는 할당을 지원할 수도 있지만 여기서는 사용되지 않습니다. –

3

두 번 오버로드해야합니다. 하나는 const이고, 이는 data access 부분이며, 하나는 참조를 반환하며 "설정자"역할을합니다.

2

찾고있는 것은 std::map의 오버로드 된 대괄호 연산자와 비슷한 기능입니다. std::map에서 대괄호 연산자는 조회를 수행하고 특정 키와 연관된 객체에 대한 참조를 반환합니다. 지도에 키와 관련된 객체가 포함되어 있지 않으면 연산자는 기본 생성자를 사용하여 새 객체를지도에 삽입합니다.

그래서, 당신은 std::map<K,V> mymap이있는 경우, 다음 mymap[someKey]를 호출하면 someKey와 연관된 값에 대한 참조를 반환하거나, 그렇지 않으면이 반환 한 후 (V의 기본 생성자) V()를 호출하여 유형 V의 새로운 객체를 생성합니다 호출자가 객체에 값을 할당 할 수 있도록하는 새 객체에 대한 참조입니다.

관련 문제