2010-03-30 4 views
20

이 있으면 어떨까요? 멤버 포인터를 사용하는 경우C++의 별표 연산자

.* 
+0

표시되는 코드를 붙여 넣을 수 있습니까? –

답변

26

예, 있습니다 :

struct foo 
{ 
    void bar(void); 
}; 

typedef void (foo::*func_ptr)(void); 

func_ptr fptr = &foo::bar; 
foo f; 

(f.*fptr)(); // call 

또한 관련이 ->* 연산자입니다. 포인터 투 멤버 형식과 함께 사용하기위한 포인터 투 멤버 연산자입니다.

예. 여기

struct A 
{ 
    int a; 
    int b; 
}; 

int main() 
{ 
    A obj; 
    int A::* ptr_to_memb = &A::b; 

    obj.*ptr_to_memb = 5; 

    ptr_to_memb = &A::a; 

    obj.*ptr_to_memb = 7; 

    // Both members of obj are now assigned 
} 

, A는 구조체이며 ptr_to_membAint의 부재에 대한 포인터이다. .*A 인스턴스를 구성원에 대한 포인터와 결합하여 주어진 A 인스턴스 obj의 해당 구성원을 참조하는 왼쪽 값 표현식을 형성합니다.

멤버에 대한 포인터는 데이터 멤버 또는 함수 멤버에 대한 포인터 일 수 있으며 가상 함수 멤버에 대해서도 올바른 작업을 수행합니다.

예. 이 프로그램 출력 f(d) = 1

struct Base 
{ 
    virtual int DoSomething() 
    { 
     return 0; 
    } 
}; 

int f(Base& b) 
{ 
    int (Base::*f)() = &Base::DoSomething; 
    return (b.*f)(); 
} 

struct Derived : Base 
{ 
    virtual int DoSomething() 
    { 
     return 1; 
    } 
}; 

#include <iostream> 
#include <ostream> 

int main() 
{ 
    Derived d; 
    std::cout << "f(d) = " << f(d) << '\n'; 
    return 0; 
} 
12

당신은 그 운영자 건너 올 수 있습니다 :

func_ptr fptr = &foo::bar; 
foo f; 
foo* fp = &f; 

(fp->*fptr)(); // call 
+0

_function_ 포인터 멤버 일뿐만 아니라. – sbi

+0

이것은 하나의 연산자입니다 (2.12 절, 5.5 절). FWIW,'-> *'도 단일 연산자입니다 (동일한 참조). –

+0

@ 스비 : 너 무슨 소리 야 ...? :) @ 제리 : 나는 실제 기호의 조합이 아니라 연산자의 조합을 의미. 혼란 스럽네요. – GManNickG