C ++ : 클래스 내에서 운영자에 액세스하는 편리한 방법?
-
03-07-2019 - |
문제
과부하가 걸리는 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!