태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

[C/C++] 클래스에서 함수포인터 배열 만들고 사용하기

Posted on 2008.04.25 22:20
Filed Under Development

  • 이 글은 Jake 에 의해 www.jakeworld.net 에서 작성되었습니다.

  • 퍼가실 때는 이 박스와 함께 복사해주세요.

일반적으로 만드는 함수포인터 배열을 만드는 방법으로 클래스 내부에서 메소드의 포인터 배열을 만드는 방법을 알아봅시다.


일반적인 함수포인터 배열 생성은 다음과 같습니다.

typedef 리턴타입 (*재정의식별자)(인자...);
재정의타입 pFunc[n];

음 한글로 쓰니까 더 어렵네요? ㅡㅡ;

예를 들어보지요.

//Function
int Add(int param1, int param2);
int Div(int param1, int param2);

//Function Pointer Array
typedef int (*FuncType)(int,int);
FuncType pFunc[2];
pFunc[0] = Add;
pFunc[1] = Div;

//Call
pFunc[0](5,6);
pFunc[1](6,2);


일반적으로 위와 같은 형태를 사용하지요.


하지만 이것들을 클래스 내부에 적용시키면 에러가 뜨게됩니다.

자세한 이유는 저도 모르겠네요 ^^


어찌됬건 해결 방법은 다음과 같습니다.

제가 사용했던 예제를 보여드리겠습니다.

enum{
    PT_GRAY_HISTOGRAM = 0,
    PT_COLOR_HISTOGRAM,
    PT_3D_DIST,
    //...................
    PT_NUM
};
typedef void (CProcess::*method_def)(IplImage* ,IplImage* );
method_def pProcess[PT_NUM];
pProcess[PT_GRAY_HISTOGRAM] = &CProcess::GHistogram;
pProcess[PT_COLOR_HISTOGRAM] = &CProcess::CHistogram;
pProcess[PT_3D_DIST] = &CProcess::Dist3D;
void CProcess::ImageProcess(int PROCESS_TYPE , IplImage* OrgImage, IplImage* DestImage)
{
    (this->*pProcess[PROCESS_TYPE])(OrgImage,DestImage);
}


요약하면

*선언할 때 재정의 식별자 앞에 클래스명을 적어야 함.

*대입할 때 주소연산자에 클래스명을 붙여야함.

*사용할 때 this->* 를 붙여야 함.

가 되겠습니다.

신고

댓글을 달아 주세요

  1. Jeonhwan L. Yang 2008.05.22 12:45 신고  댓글주소  수정/삭제  댓글쓰기

    호출방식의 차이로 인해 에러가발생합니다.

    thiscall 과 cdecl 두가지 차이이죠^^ 자세한건 찾아보세요^^
    이곳저곳 떠돌다가 몇 자 적고 갑니다.

About



모바일 페이지 QR 코드

Counter

· Total
: 468,854
· Today
: 92
· Yesterday
: 114


DNS server, DNS service