2010-08-03 4 views
3

몇 가지 이상한 이유로 연산자 ->() 메서드를 직접 호출해야합니다. 예를 들어 :"operator ->()"를 직접 호출하려면 어떻게해야합니까?

class A { 
    public: 
     void foo() { printf("Foo"); } 
}; 

class ARef { 
    public: 
     A* operator->() { return a; } 
    protected: 
     A* a; 
}; 

내가 레프 개체가, 내가 쓰기로 foo는()를 호출 할 수 있습니다

aref->foo(); 

는 그러나, 나는이 보호 된 멤버 'A'로 포인터를 얻을합니다. 어떻게해야합니까? 이 구문뿐만 아니라 다른 모든 사업자에 대해 작동

+0

당신의 질문 제목은 당신이'operator->'를 직접 호출하기를 원한다는 내용입니다. 질문의 본문은'ARef :: a'에 대한 포인터를 얻고 싶다고 말합니다. 이것들은 전혀 관련이없는 두 가지 문제입니다. 그래서, 당신은 무엇에 대해 물어보고 싶은가요? 둘 사이에 연결이 있으면 설명하십시오. – AnT

답변

10
aref.operator->(); // Returns A* 

참고 : 청소기 구문을 보려면

// Assuming A overloads these operators 
A* aref1 = // ... 
A* aref2 = // ... 
aref1.operator*(); 
aref1.operator==(aref2); 
// ... 

, 당신은 A A Get() 기능을 구현하거나 제안으로 &*aref 수 있도록하는 * 연산자를 오버로드 할 수 있습니다 James McNellis.

3

operator->()으로 직접 전화 할 수 있습니다.

A* result = a.operator->(); 
당신은 바로 다음과 같은 구문을 사용하여 연산자를 호출 할 수 있습니다
5

:

aref.operator->() 

당신은 아마 오버로드해야을 모두 그 사용이 포인터의 사용과 일치되도록 ->* :

class ARef { 
    public: 
     A* operator->() { return a; } 
     A& operator*() { return *a; } 
    protected: 
     A* a; 
}; 

다음을 사용하여 포인터 값을 가져올 수 있습니다.

&*aref 

당신은 또한 (대부분의 스마트 포인터 클래스가 get() 멤버 함수를 제공하는) 이러한 솔루션 중 하나보다 훨씬 깨끗하고 많이 직접 A*를 반환하는 get() 멤버 함수를 구현할 수 있습니다.

+0

보통'ptr-> FooBar()'를보고 나서'ptr()'을보고 싶다면 스마트 포인터 클래스 자체 (예를 들어'GetRawPtr (ptr);')에 정의 된 친구 함수로'get .get()'다른 곳에서. –

2

아마 함께 부르지 만, 대신 더 읽을 것이기 때문에 같은 작업을 수행하는 새로운 멤버 만들 것입니다 :

class ARef { 
public: 
    A* operator->() { return get(); } 
    A* get() const { return a; } 
protected: 
    A* a; 
}; 
2

결석 한 친구를, 당신은 보호 된 멤버에 "포인터를 얻을 수 없다 a "외부 클래스 A 또는 그 자손 중 하나. 교환 원 ->은 전화하는 방법에 관계없이 여기에서 도움을받지 않습니다.

ARef의 현재 인터페이스를 감안할 때, a에 대한 포인터를 얻을 수있는 유일한 방법은 클래스 A의 방법 또는 일부 하위 클래스 중 하나 내부 A **pa = &a 그런 짓을하는 것입니다.

왜 내가 a에 대한 포인터를 가져와야하는지 잘 모르겠지만 솔직히 말해서 나에게는 실용적이지는 않지만 실제로 필요하다면 정확하게 수행하는 별도의 메소드를 추가 할 수 있습니다 그

class ARef { 
public: 
    ... 
    A** get_ptr_to_a() { return &a; } 
    ... 
}; 
관련 문제