2013-08-04 1 views
2

우리는 클래스 숙제의 일부로 Herb Sutter의 Exceptional C++ 서적을 읽고 있습니다. 항목 36 :Exceptional C++ Item 36

가 나는 형식 정의가 실제로 무엇을하고 있는지 이해하고 그것을 구성하는 방법을 해독에 질문이

누군가가 typefef의 논리 불구하고 산책 할 수있는 큰 도움이 될 것입니다 경우.

class B 
{ 
public: 
    virtual ~B(); 
    void operator delete (void*, size_t) throw(); 
    void operator delete[] (void*, size_t) throw(); 
    void f(void*, size_t) throw(); 
} 
class D : public B 
{ 
public: 
    void operator delete (void*) throw(); 
    void operator delete[] (void*) throw(); 
}; 

typedef void (B::*PMF)(void*, size_t); 
PMF p1 = &B::f; 
PMF p2 = &B::operator delete; 

클래스 B (PMF)에서 멤버 함수에는 포인터가 없기 때문에, 는 PMF와는 어떻게 생성됩니까 무엇인가?

typedef의 반환 형식이 무효입니까? (void * 및 size_t)는 typedef의 인수입니까?

덕분에 이미 댓글에서 설명한 바와 같이

+1

PMB 대신 PMF를 사용 했습니까? – Borgleader

+3

cdecl.org에 따르면 : PMF를 B 클래스의 멤버에 대한 포인터로 선언 function (void, size_t) return void C : '클래스 멤버의 포인터'에서 지원되지 않음 – Borgleader

+1

코드에 오류가 있습니다 클래스의 끝에';'B :: F'는'B :: f'이어야합니다). – Snps

답변

6

typedef 키워드는 기존의 유형에 대한 별칭을 선언 ... PMF 공용 멤버 함수의 약자임을 확신합니다. 함수 포인터void 복귀 (즉voidsize_t포인터 복용) 예

typedef int integral; 
integral i = 1; 

라인 typedef void (B::*PMF)(void*, size_t); 들어

은 타입에 대한 별칭 PMF을 선언한다.

나선 규칙를 사용하여 복잡한 선언에서 유형을 해석하는 방법에 대한 자세한 설명은이 링크를 참조하십시오 : The Clockwise/Spiral Rule

PMF이 유형에 대한 별명입니다. B의 멤버이고 동일한 매개 변수 목록과 반환 유형을 가진 모든 함수에 대한 포인터를 선언하는 데 사용할 수 있습니다.

PMF p1 = &B::f; // Declare p1 as a PMF and set it to point to address of B::f. 
B b; // Create instance of B (needed as p1 points to a member function). 
(b.*p1)(nullptr, 0); // Here p1 can be used as if it was a call to B::f. 
0

는 PMB는 주어진 인수 목록을 복용 B의 멤버 함수에 대한 포인터입니다. 그것은 새로운 타입의 이름입니다 - 클래스 B 자체의 어떤 것과도 일치하지 않습니다. void 포인터와 size_t : Borgleader 이미 지적한 바와 같이

0

typedef 당신이 void 반환 형식과 두 개의 인자를 가지고있는 B 클래스의 멤버 함수를 참조 할 수 있습니다.

나는

+3

Pointer-to-Member-Function imo와 매우 흡사합니다. – Borgleader