2009-10-29 8 views
4

난 그냥 발견했습니다 기존의 클래스에 유형을 추가하기 전에 내가 본 적이없는 기술을 사용합니다 (http://msdn.microsoft.com/en-us/library/k8336763(VS.71).aspx에서) 일부 C++ 코드 :클래스에 유형을 추가하는 C++ 기술은 무엇입니까?

class Testpm { 
public: 
    void m_func1() { cout << "m_func1\n"; } 
    int m_num; 
}; 

// Define derived types pmfn and pmd. 
// These types are pointers to members m_func1() and m_num, respectively. 
void (Testpm::*pmfn)() = &Testpm::m_func1; 
int Testpm::*pmd = &Testpm::m_num; 

int main() { 
    Testpm ATestpm; 
    Testpm *pTestpm = new Testpm; 

    // Access the member function 
    (ATestpm.*pmfn)(); 
    (pTestpm->*pmfn)(); // Parentheses required since * binds 

    // Access the member data 
    ATestpm.*pmd = 1; 
    pTestpm->*pmd = 2; 

    cout << ATestpm.*pmd << endl 
     << pTestpm->*pmd << endl; 
} 

누군가가 무엇을이 기술을 정의하는 말해 주시겠습니까를 파생 된 형식이 호출되거나 그것에 대한 일부 문서를 가리키고 있습니까? 나는 C++을 사용하여 13 년 만에 그것을 보지 못했으며, 나의 무지를 종식시키고 싶다.

+0

"기존 클래스에 유형 추가"란 무엇을 의미합니까? 또한 코드의 어떤 부분이 "기존 클래스에 유형을 추가합니까?" 내가 볼 수있는 것은 회원에 대한 포인터의 사용입니다. – sellibitze

+0

코멘트로 참조하십시오 // 유도 유형 pmfn 및 pmd 정의. 및 라인 예 : ATestpm. * pmd = 1; 'pmd'가 Testpm 클래스에 추가되었다고 제안합니다. 이것들이 나의 질문을 던지며 내가 그 말을하는 방식이다. 지금 코드를 살펴보고 지금까지 제공된 대답의 이점을 통해 pmd와 pmfn이 Testpm 내부의 멤버에 대한 포인터로 정의되고 있음을 알 수 있습니다. 그것은 그들이 객체가 아니라 클래스에 대한 포인터라는 사실입니다. Testpm 객체에서 액세스 할 수있는 방법은 혼란 스럽습니다. 전에는 이것을 보지 못했기 때문에. –

+1

이들은 클래스의 멤버에 대한 포인터입니다. 'pmfn': 멤버 함수에 대한 포인터이고 'pmd': 멤버 데이터에 대한 포인터입니다. 이 개념은 STL 사용자에게 노출되지 않지만 STL 알고리즘 내에서 많이 사용됩니다. –

답변

6

의견이 잘못되었습니다. pmfn과 pmd는 "파생 형식"이 아닙니다 (형식이 짝수가 아닙니다!). 그들은 pointers to members입니다.

+1

믿기 어렵지 만 사실 : 멤버에 대한 포인터조차도 유형이다. – sbi

+0

"유형이 있습니까?"또는 "유형이 있습니까?" 만약 내가 typedef int를 썼다면 Testpm :: * pmd_t = & Testpm :: m_num; pmd_t pmd; 명확하게 pmd_t는 유형이지만 pmd도 유형입니까? 두 번째 경우는 질문의 코드에 적용됩니다. – user200783

+1

그들은'typedef'를 넣은 것처럼 보이고 그것을 제거하고 코멘트를 바꾸는 것을 잊었습니다.사실, C++에서 "복합 유형"이라고하는 것을 C에서 "파생 유형"이라고합니다. 따라서 코드의 주석은 믿습니다. –

4

나는 그들이 클래스에 "유형을 추가하는"것이라고 생각하지 않습니다. 그것들은 멤버 함수와 클래스의 멤버 데이터에 대한 포인터 유형을 정의한 다음 멤버 함수 및 데이터 멤버에 액세스하는 데 사용하는 것처럼 보입니다. 형식을 멤버 함수가 아닌 멤버로 선언하는 것과 비슷하지만 클래스의 멤버가되어 구문이 다릅니다. 통상 C 함수 또는 정적 C++ 멤버 함수 포인터가있는 한편 : 구문에 대해서는 사이트 here

가입일

두 다른 함수 포인터의 종류가있다. 반면에 에는 비 정적 C++ 멤버 함수에 대한 포인터가 있습니다. 기본 차이 은 모든 정적 함수에 대한 포인터가 숨겨진 인수를 필요로한다는 점에 유의하십시오. 클래스의 인스턴스에 대한 포인터. 항상 마음 속에 보관하십시오.이 두 유형의 함수 포인터는 각각 기타와 호환되지 않습니다.

+0

실제로 그들은 포인터 유형을 정의하지도 않습니다. 포인터 자체를 정의하고 있습니다. – user200783

+0

나는 포인터의 유형을 정의하지 않고 단지 그것들의 인스턴스를 생성하고 그것을 사용하고있다. 나는 수면 부족을 비난한다 ... – pxb

관련 문제