본문 바로가기

프로그래밍/디자인패턴

[ST교육] thiscall 2


함수포인터와 멤버 함수




a)는 일반 함수를 일반 함수 포인터에 담는 것이다. 문제없이 실행된다.

b)는 멤버 함수를 일반 함수 포인터에 담는 것이다.


error C2440: '초기화 중' : 'void (__thiscall Dialog::* )(void)'에서 'void (__cdecl *)(void)'(으)로 변환할 수 없습니다.


b)는 이런 에러를 발생시킨다. 
일반 함수 포인터에 멤버 함수의 주소를 담을 수는 없기 때문이다.

에러에 나온 말대로 d)와 같이 수정해주면 된다. 멤버 함수의 주소는 멤버 함수 포인터에 담는다. 

하지만, 일반 함수 포인터에 정적 멤버 함수의 주소를 담을 수 있다. 
앞서 말했듯이 static 멤버 함수는 일반 전역 함수와 비슷한 역할을 한다. 또한 this 없이 부를 수 있기 때문에
c)가 가능하다.


d)의 func3 함수를 호출할 방법을 알아보자.
( 멤버 함수 포인터를 만들고 사용하는 방법 )

e)처럼 func4(); 로 부를 수 있으면 얼마나 간단하고 좋을까.
하지만 이는 일반 함수 포인터가 아니라 멤버 함수 포인터이다. 

dlg라는 객체를 선언하여 f)로 부를려고 해도 멤버 함수가 아니기 때문에 나타나지 않는다. 

결론은 g)이다.
func4함수에 포인터를 붙여 역참조한다.
* 연산자는 () 연산자보다 우선순위가 낮기 때문에 ()를 써준다.


정리하면, 


1. 일반 함수 포인터에 멤버 함수의 주소를 담을 수는 없다.

2. 일반 함수 포인터에 정적 멤버 함수의 주소를 담을 수 있다. (static은 this없이 부를 수 있으니까.)

3. 멤버 함수 포인터를 만들고 사용하는 방법을 알아두자.



'프로그래밍 > 디자인패턴' 카테고리의 다른 글

[ST교육] thiscall 4  (0) 2014.08.31
[ST교육] thiscall 3  (0) 2014.08.31
[ST교육] thiscall 1  (0) 2014.08.28
[디자인패턴] Adapter Patten  (0) 2014.01.28
[디자인패턴] =================================================  (0) 2014.01.28