2016-07-29 1 views
0

누구나 Foo 클래스의 오버로드 된 연산자가 Foo * 유형의 포인터에서 호출되지 않는 이유를 설명해 주실 수 있습니까?C++ 오버로드 연산자 ->()을 호출하지 않습니까?

#include <iostream> 
using namespace std; 

class Foo { 
public: 
Foo * operator ->() { 
    cout << "calling Foo * operator ->()\n"; 
    return this; 
} 
    int x; 
}; 


void main() { 
    Foo f; 
    Foo * pF = &f; 
    pF->x;     // Why is overloaded operator-> not being called here? 
    (pF->operator->())->x; // This works. 

    cout << "End test.\n"; 
} 
+0

두 번째 문은 작동합니다. 거기에 과부하가 없습니다. 아래에서 답하는 것처럼 포인터가 아닌 인스턴스에 대해서만 연산자를 오버로드 할 수 있습니다. –

답변

6

왜 여기>를 호출하지 운용자에 과부하가?

pFFoo 인스턴스가 아니기 때문에 포인터입니다. Foooperator->이 오버로드되었으므로 Foo*이 아닙니다. 오버로드 된 operator->f에 직접 전화 할 수 있습니다.

f->x; 

당신은 Foo* 또는 다른 포인터 유형에 대한 operator->를 오버로드 할 수 없습니다.

+0

음, 거기에 암시 적 포인터 가상 주소 시스템에 대한 내 희망을 간다. 클라이언트에게 Foo *를주고, Foo 객체를 메모리 (최적화)로 옮기고, Foo *가 여전히 객체를 가리 키도록 할 수 있습니다. 스마트 포인터 컨테이너 클래스를 사용하는 것처럼 보입니다. –

3

Foo*이 아닌 Foo에 오버로드되었습니다 (불가능 함). 물론,

(f.operator->())->x; 

을 또는 :

은 일한 것

f->x; 

은 짧은 구문을 사용할 수 있다는 아니, 과부하의 전체 목적은? 연산자를 호출 한 동일한 객체에 대한 포인터를 반환하는 것은 매우 혼란 스럽지만 말입니다.

+0

왜 그렇게 왕성한 방법으로 전화를 걸습니까? 왜'f-> x'가 아닌가? –

+0

@Revolver_Ocelot : 예 또는 그. 나는 OP의 의도를 지키기 위해 직접 버그를 수정하고 싶었다. –

+0

@ HiI'mFrogatto : 아니요.'operator->'의 전체적인 요점은'f-> x'가 작동하도록 만드는 것입니다. –

2

Foo*이 아닌 Foo 유형의 "지점 간"연산자가 오버로드되었습니다. 사용의

class Foo { 
public: 
    // Overload 'point-to' operator of 'Foo' 
    Foo * operator ->() { 
     cout << "calling Foo * operator ->()\n"; 
     return this; 
    } 
    int x; 
}; 

예 : - 방법은 포인터 pF의를 사용하여>는 기본적으로 운영자를 호출하기 때문에

Foo f; 
f.operator->();