페이지

2005년 1월 5일 수요일

c에서 cpp 클래스 멤버 함수 호출에 관하여

http://bbs.kldp.org/viewtopic.php?t=24593&highlight=delete+pointer

get_ptr 이 마치 생성자의 역할을 해야하는데, 그렇지 않은 코드이군요.

C++ member 함수를 호출할 때는, C++ 에서 (C아닌) wrapper 함수를 제공해주어야 정상적으로 호출할 수 있습니다.

심지어 위의 코드에서 X::ftn1, X::ftn2 함수는 static 이므로 this pointer가 넘어가지 않는 함수이군요.

어셈블 코드를 설명하는 방식이 아니어서 죄송합니다만. 위에 제시하신 class X를 C 코드에서 사용하려면, 다음과 같은 interface를 작성해주시는 것이 좋습니다. ftn1과 ftn2 를 static 으로 하지 않는 코드로 설명드리면..

t2.cc
코드:

class X {
public:
int x;
int y;
void ftn1(void);
int ftn2(int,int);
};

type void XX;

extern "C" XX * X_init()
{
return (XX *) new X;
}

extern "C" void X_ftn1( XX * pthis )
{
((X*)pthis)->ftn1();
}

extern "C" int X_ftn2( XX * pthis, int a, int b )
{
return ((X*)pthis)->ftn2(a,b);
}

extern "C" void X_destroy( XX * pthis )
{
delete pthis;
}

t1.c
코드:

int main(int argc, char* argv[])
{
XX * p = X_init();
X_ftn1(p);
X_ftn2(p,10,11);
X_destroy( p );
}

... 컴파일 안하고 올리는거라 오류가 있다면 답글 주세요. 메모리 할당 오류 등은 생략하였습니다.
_________________
가는 선, 정교한 생명시계.
오늘도 하루를 오차없는 프로그램처럼 살아 있다.

댓글 없음:

댓글 쓰기