문제

과부하가 걸리는 C ++ 클래스가 있습니다 operator[], 배열 첨자/브래킷 연산자. 이것은 내 수업 이외의 끔찍하게 편리합니다. foo[bar]. 그러나 방법을 구현할 때이 표기법을 사용하는 방법을 알 수 없습니다. 내부에 내 수업.

나는 내가 쓸 수 있다는 것을 안다 operator[](bar) 또는 this->operator[](bar) 그러나 그것들은 상당히 다루기 어려우며 처음에는 운영자의 편의를 많이 빼앗아갑니다. (나는 또한 연산자를 호출하는 새로운 방법을 추가 할 수 있다는 것을 알고 있습니다.) 쓸 수있는 방법이 있습니까? this[bar] 또는 this->[bar] 아니면 비슷하게 좋은 것?

메모:이 질문은 또한 많은 단체 연산자에게도 적용될 수 있습니다 (예 : 어떻게 전화 할 수 있습니까? foo++ 수업 내에서?)하지만 개인적으로는 operator[].

편집하다: 게시 직후에 사용할 수 있다는 것을 깨달았습니다. (*this)[bar]. 지금까지 모든 답변도 이것을 제안했습니다. 다른 대안이 있습니까?

도움이 되었습니까?

해결책

(*this)[bar];

나를 위해 잘 작동합니다.

다른 팁

대안 (*this)[bar] 작업을 수행하는 명명 된 멤버 함수를 사용하는 것입니다. operator[]. 오버로드 된 운영자는 사용자에게 더 쉽게 일을 할 수 있습니다. 더 중요한 것은, 그들은 당신의 수업의 일부입니다. ' 상호 작용. 자체 공개 인터페이스 측면에서 수업을 구현하는 것이 실제로 합리적인지 스스로에게 물어보십시오. 그렇지 않은 경우 작업을 수행하기 위해 별도의 (보호 된 또는 개인) 회원 기능을 작성하는 것이 좋습니다. operator[] 그리고 다른 기능을 부릅니다.

At () 함수를 사용하고 연산자 []가 무대 뒤에서 AT () 함수를 호출하도록하므로 연산자 []는 단지 구문 설탕입니다. 그것이 STD :: Vector가 수행하는 방식이므로 합리적인 (우선 순위) 방법처럼 보입니다.

이제 완전한 구문 설탕 해킹을 위해 (내가 그것을 완전히 추천하지만 당신의 공상을 공격 할 수 있다고 말할 수는 없습니다) :

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)

사실 나는 그것이 Apple의 NS API에서 대부분의 손잡이가 구현되는 방식이라고 생각합니다 ...

사용

(*this)[bar]

전화하기 위해 operator[] 인스턴스 객체의.

this[bar] 치료합니다 this 배열로서의 포인터 bar해당 배열의 제 1 요소 (alvalid 객체 참조 가능성이 반환 됨).

You could use (*this)[bar], but that might not be much of an improvement...

 operator[](bar) 

This should work too. It works for me!

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