C++ 에서 함수포이터 문제( 검색해서 읽어봐도 잘 모르겠어요..
글쓴이: killerwizard / 작성시간: 목, 2004/10/07 - 12:08오후
안녕하세요.
C++에서 함수 포인터를 구현해야 하는데..
아직 개념이 없어서 잘 모르겠습니다.
검색을 해서 쭉 읽어보았지만 잘 이해가 안되어서 이렇게 질문을 드립니다.
좀 도와주십시요.
class CWbase { public: CWbase(); virtual ~ CWbase(); public: byte bState; byte bError; byte bIterCnt; byte bRepeat; byte bErrCnt; long data; void (*Process)(void); }; class CWeight { public: CWeight(CString type, LPVOID m_pClass); CWeight(); virtual ~CWeight(); private: LPVOID pClass; CWbase wgt; private: void Test(); void Mode_UnStable(); }; void CWeight::Test() { wgt.bState &= (byte)~(WGT_STATE_TRACKING | WGT_STATE_STABLE ) wgt.bState |= WGT_STATE_UPDATE; wgt.bIterCnt=(byte)ITER_STABLE; wgt. Process = Mode_Unstable; } void CWeight::Mode_UnStable() { bErrCnt++; }
다음과 같은 에러가 발생합니다.
cannot convert from 'void (__thiscall CWeight::*)(void)' to 'void (__cdecl *)(void)' There is no context in which this conversion is possible
클래스가 두개 있고요.
CWeight 에서 CWbase의 객체를 생성하고
CWbase의 함수포인터 함수에 CWeight의 멤버 변수를 넣어서 실행하고
싶은데 잘 안되네요.
좀 도와주십시요.
Forums:
아~CWeight 클래스 외부에서 CWeight 의 메쏘드를 일반함수
아~
CWeight 클래스 외부에서 CWeight 의 메쏘드를 일반함수처럼 호출 하신것 같은데요..
그렇게 하시려면 그 해당 메쏘드를 static 으로 선언 해서 사용하시던지..
아니면 CWeight 의 인스턴스를 만들어서 메쏘드를 호출을 하셔야 합니다.
compile time에 Mode_Unstable의 주소를 몰라서 생기는
compile time에 Mode_Unstable의 주소를 몰라서 생기는 에러가 아닐지..
Mode_Unstable 함수에 static을 달아보세요
하나.. 둘.. 셋!
void (*Process)(void);이렇게 선언하면 Proce
void (*Process)(void);
이렇게 선언하면 Process는 일반함수 또는 클래스의 정적 멤버함수에 대한
포인터라는 뜻입니다. 지금은 Process를 CWeight 클래스의 비정적 멤버함수에
대한 포인터로 쓰려고 하시는 것 같은데, 그렇다면 다음과 같이 해야 합니다.
여기서 wgt.Process는 CWeight::Mode_UnStable에 대한 포인터이죠.
그리고 this 개체를 통해 CWeight::Mode_UnStable를 호출하는 것입니다.
감사합니다..답변을 잘 해주셔서 잘 해결되었습니다.이렇게 하나씩
감사합니다..
답변을 잘 해주셔서 잘 해결되었습니다.
이렇게 하나씩 배우면서 내공을 쌓아가야 하겠습니다.
좋은 하루되세요.
댓글 달기