2011-03-06 3 views
1

질문은 마지막 두 줄의 코드에서 제공됩니다. TestClass 더 멤버 함수 Detach이 없기 때문에 C++ - 왜 operator ->를 사용하여 SmartPtr의 멤버 함수에 액세스해야합니까?

template<class T>     // template class for smart 
class SmartPtr {      // pointers-to-T objects 
public: 
    SmartPtr(T* realPtr = 0); 

    T* operator->() const; 
    T& operator*() const; 

    T* Detach(void) 
    { 
    T* pData = pointee; 
    pointee = NULL; 
    return pData; 
    } 

private: 
    T *pointee; 
    ... 
}; 

class TestClass {} 

SmartPtr<TestClass> sPtr(new TestClass); 

TestClass* ptrA = sPtr->Detach(); 
// why I always see people use this method to access member functions of a Smart pointer. 
// We can use sPtr-> b/c we have defined operator->() in SmartPtr.  

TestClass* ptrB = sPtr.Detach(); 
// Question: Is this a valid C++ way? If not, why? 

답변

8
SmartPtr<TestClass> sPtr(new TestClass); 
TestClass* ptrA = sPtr->Detach(); 

이 실제로 유효 주셔서 감사합니다. SmartPtr 클래스의 operator->T* operator->() const으로 선언되므로 스마트 포인터의 pointee을 반환해야합니다. sPtr 자체는 단지 일반 지역 스택 변수가 아닌 포인터이기 때문에

TestClass* ptrB = sPtr.Detach(); 

은 유효한 버전입니다.

0

그들은 모두 유효한 구문이지만 다른 기능을 호출합니다!

p.detach()는
P-> 분리() 타입 T

꽤 차이에 개체 P 점의 분리 함수를 호출 할 P 객체의 분리 기능을 호출한다!

관련 문제