2017-11-06 1 views
0

포인터에 대해 전역으로 "->"연산자를 오버로드하려고합니다. 가능한가?전역 연산자 "->"오버로드 C++

A *var1 = new A(21); 
int x = var1->someInt; 

"var1"의 "someInt"변수에 도달 할 때 해당 코드에서 트리거되어야합니다.

실제로 멤버에 도달하기 전에 포인터를 확인하려고합니다. 또한이 시스템을 작성된 코드로 구현하려고하므로 실제 코드에서 너무 많은 것을 변경하고 싶지 않습니다.

+1

[이 연산자 과부하 참조] (http://en.cppreference.com/w/cpp/language/operators)에서 알아야 할 내용을 알려야합니다. 논리적으로 생각하면 질문에 답할 수 있습니다 (*** 개체 구성원 액세스 *** 연산자는 개체없이 어떻게 작동합니까?). –

+1

이 연산자가 어떤 인수도 취하지 않고 무엇을 기대합니까? – interjay

+0

올바르게 기억하면 언어 정의에 'operator-'가 멤버 함수 여야합니다. –

답변

2

섹션 16.5.6 (강조 내)에서 C++ 17 표준 초안 바와 같이

조작자 활동한다 어느 비 정적 멤버 함수이거나 비 멤버 함수 것을 유형이 인 클래스가 하나 이상인 매개 변수, 클래스에 대한 참조, 열거 또는 열거 형에 대한 참조가 있습니다.

따라서 인수를 취하지 않는 연산자를 오버로드 할 수 없습니다.

2

전역으로 "->"연산자를 오버로드하고 싶습니다. 가능한가?

아니요.

아마도 라이브러리 또는 프로그램 (해당 연산자는 ->을 정의 할 것입니다)에 "루트"클래스를 정의하고 모든 클래스를 상속 받아야 할 수도 있습니다.

나는 모든 유형 (유효한 어떤 종류의 자동 변수의 주소 포함)에도 효과적으로 isPointerValid 함수를 정의 할 수 있을지 확신 할 수 없습니다.

이러한 기능을 정의 할 수없는 경우가 많습니다 (예 : tagged union 유형에 사용 된 union -s, 현재 활성화 된 유니언의 구성원을 쉽게 알 수 없음, 임의의 캐스트 ...). .

기존 코드 및 클래스의 경우 기본 정의가 -> (일반적으로 다시 정의 할 수 없음)은 이미 코드를 사용하여 코드를 컴파일하는 데 사용되었습니다.

+0

루트 클래스를 선언하는 것이 좋지만이 시스템을 작성된 코드로 사용하려고합니다. 그래서 나는 그 많은 것을 바꿀 수 없다. – wArtist

+0

귀하의 질문에 반드시 들어가야하며 불가능합니다. 실제 동기와 상황을 더 자세히 설명하려면 질문을 개선해야합니다. –