2016-10-26 2 views
-2

내가 아래 첨자 연산자를 재정의하려는 예제 Map 클래스가 있습니다. 클래스의 사용자가지도를 읽고 쓸 수있게합니다. 지도 [ "a"]가 읽히고,지도 [ "a"] = "something"이 (가) 클래스의 쓰기가됩니다. 그러나, 나는 물건의 할당 연산자 측면을 사용하는 방법을 알아낼 수 없으며 전달 된 값으로 그것을 대체 할 수 있습니다. 나는 그냥 "분할 오류"여기첨자 연산자 오버플로

읽는 새로운 값을 할당하려고하면 지금, 내가 지금까지 무엇을 가지고 :

VALUE_TYPE& Map::operator[](KEY_TYPE a){ 
    cout << "hmm" << endl; 


} 



Map& Map::operator=(const Map &rhs){ 
    //cout << "operator = " << endl; 
} 

지금 내가 어떤 코드가 없습니다 .. 그들은 단지 그들이 성공적으로 부름받을 것을보고 싶었습니다. 나는 세그먼트 오류를 ​​얻을 것이다

Map["a"] = "hey"; 

과 같은 일을 할 경우 내가 알아낼 수없는 무엇

이다. 특정 키에 새로운 값을 할당하려고 할 때 할당 연산자 =가 호출 될 것이라고 가정하고있었습니다. 내가 뭔가 잘못하고 있는거야?

그런데 VALUE_TYPE 및 KEY_TYPE은 문자열로 정의되며 각 키의 값은 관련되어 있습니다.

+0

이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

+0

처음보세요. 운영자는 '맵'권한이 아닌'유형 '을 가져야합니다. 왜냐하면'Map [a]'는 map의 요소를 반환 할 것이기 때문이다. 지도가 아닙니다. 그것이지도의지도가 아니라면. –

+1

연산자 =는 단일 요소가 아닌 전체 맵을 할당합니다. –

답변

3

지도에 지정하는 것이 아니라 operator[]에 의해 반환 된 개체에 지정합니다.
은 (m["a"] = "hey";에서 m["a"] 그것이 VALUE_TYPE& 야하는 Map 아니다.)

오퍼레이터가 유효한 객체에 대한 참조를 반환해야 그렇지 않은 경우, 동작이 정의되지 않는다. 내가 가지고 올 수

작은 예 :

struct Mapp 
{ 
    int& operator[](int i) { return member; } 
    int member; 
}; 

int main() 
{ 
    Mapp m; 
    m[0] = 12; // Assigns 12 to m.member 
} 

는 또한 운전자의 CONST 버전을 오버로드 할 수 있습니다.

+0

와우는 많은 의미를가집니다 ... 지정 될 객체를 반환하지 않았습니다! 고맙습니다! –