2009-03-03 2 views
25

배열 서브 스크립트/대괄호 연산자 인 operator[]을 오버로드하는 C++ 클래스가 있습니다. 이 수업은 수업 외에서 매우 편리합니다. foo[bar을 작성할 수 있습니다. 그러나, 나는 내 클래스의 메소드를 구현할 때이 표기법을 사용하는 방법을 알 수 없습니다.C++ : 수업 내에서 연산자 []에 편리하게 액세스 할 수 있습니까?

나는 operator[](bar) 또는 this->operator[](bar)을 쓸 수 있지만, 상당히 다루기가 쉽지 않으며 처음에는 운영자의 편리함을 많이 제거합니다. (나는 또한 연산자를 호출하는 새로운 메서드를 추가 할 수 있다는 것을 알고있다.) this[bar] 또는 this->[bar] 또는 비슷하게 좋은 것을 쓸 수있는 방법이 있는가?

: (? 예를 들어, I 클래스 내에서 foo++를 호출하는 방법)이 질문은 또한 많은 단항 연산자에 적용 할 수있는,하지만 난 개인적으로 약 operator[] 신경.

편집 : 게시 후 곧 실현되었습니다. (*this)[bar]을 사용할 수 있습니다. 지금까지의 모든 대답이 이것을 제안했습니다. 다른 대안이 있습니까?

+0

당신이 좋아할만한 구문 해설을 추가했습니다. (그러나 표준 해결책은 아닙니다) –

답변

39
(*this)[bar]; 

은 저에게 잘 맞습니다.

+0

누구에게나 다른 대안이 있다면 알려주십시오. 그때까지 (나는)이 대답을 받아들입니다. 감사. –

3

사용

(*this)[bar] 

는 인스턴스 객체의 operator[]를 호출합니다.

this[bar] 배열 및 인덱스 (a-것으로 잘못 객체 참조를 반환)이 배열 bar 번째 요소로 this 포인터를 처리한다.

1

당신은 사용할 수 (*이) [바]하지만, 그 개선의 많은되지 않을 수도 있습니다 ...

3

(*this)[bar]에 대한 대안이 operator[]의 작업을 수행 명명 된 멤버 함수를 사용하는 것입니다 . 오버로드 된 운영자는 사용자를 편하게 만듭니다. 더 중요한 것은, 그들은 당신의 클래스 '인터페이스의 일부입니다. 자신의 공용 인터페이스 측면에서 클래스를 구현하는 것이 실제로 중요한지 스스로에게 물어보십시오. 그렇지 않다면 작업을 수행하기 위해 별도의 (보호 된 또는 비공개) 멤버 함수를 작성한 다음 operator[] 및 다른 함수로 호출하는 것이 좋습니다.

3

at() 함수를 사용하고 연산자 []가 at() 함수를 호출하기 때문에 연산자 []가 구문상의 설탕에 불과합니다. 이것이 std :: vector가하는 방법입니다. 그래서 그것을 수행하는 데 우선 순위가있는 합리적인 것처럼 보입니다.

이제 완전한 문법 설탕 해킹에 대한 (I 완전히 추천하지만 공상을 공격 할 수 말할 수 없다) 또한

class Widget 
{ 
    Widget&  self; 
public: 
    Widget() :self(*this) 
    {} 

    void operator[](int) 
    { 
     printf("hello"); 
    } 

    void test() 
    { 
     //scripting like sugar 
     //you pay the price of an extra reference per class though 
     self[1]; 
    } 
}; 


int main(int argc, char* argv[]) 
{ 
    Widget w; 
    w[1]; 
    w.test(); 
    return 0; 
} 

을 당신은 비용을 지불하지 않고 무료로이 작업을 수행하려면 참조, 프로그래머를 만들기 위해 최선을 다하고 어떤 사악한 종파의 추종자 당신이 할 수있는 고통 :

#define self (*this) 

이 사실 나는 그 대부분의 핸들이 애플의 NS API를 구현하는 방법을 생각 ...

+0

나는 지난 몇 분 동안 그것을 해왔 던 방식이 자기 = *를 설정하고 자기를 사용했기 때문에 어떤 의미에서 이것을 좋아합니다. 감사. –

+6

vector :: at()가 operator []()를 호출하기 전에 범위 검사를 수행해야하기 때문에 Vector는 다른 방법입니다 – MSalters

1
operator[](bar) 

이렇게해도됩니다. 그것은 나를 위해 일합니다!

+0

제 질문에, 제가 언급 한 첫 번째 옵션입니다. –

관련 문제