태그 보관물: fp

class function pointer

[code lang=”cpp”]

class IFunction
{
public:
IFunction() {}
virtual ~IFunction() {}

virtual void Run() = 0;
};

template<typename T>
class TFunction : public IFunction
{
public:
TFunction()
{
m_pObj=0;
}
TFunction(T* pObj, void (T::*pFunc)())
{
m_pObj=pObj;
m_pFunc=pFunc;
}
virtual ~TFunction()
{
}
void Run()
{
if(0!=m_pObj)
(m_pObj->*m_pFunc)();
}

private:
T* m_pObj;

void (T::*m_pFunc)();
};

class CApp
{
public:
CApp()
{
m_pfnCallBack = new TFunction<CApp>(this, &CApp::CallBack );
}
~CApp()
{
delete m_pfnCallBack;
}
void Run()
{
m_pfnCallBack->Run();
}
void CallBack()
{
puts("~~~~");
}

protected:
IFunction* m_pfnCallBack;
};

int main(int argc, char* argv[])
{
CApp app;
app.Run();
return 0;
}

[/code]

함수 포인터

문장(statement)이 정수, 혹은 실수처럼 어떤 값(value)을 가질 때 이러한 문장(statement)을 표현식(expression)이라고 한다. 문장은 ;으로 끝나므로 쉽게 구분 가능ㅎ다. 문장에서 ;을 제외한 부분이 표현식이 되려면, 그것이 값이어야 한다. 예를 들면, 2+3; 이라는 문장에서 2+3dms 5라는 값을 가지므로 표현식이다. 하지만 return; 이라는 문장에서 return은 값을 가지지 못하므로 표현식이 아니다. 표현식은 등호(=)의 오른쪽에 사용될 수 있음을 의미한다. 함수의 이름이 표현식임을 아는 것이 중요하다.

[code lang=”cpp”]
int sum(int a, int b)  {  return a + b; }

void main()
{
  int (*fp)(int, int);    // 함수 포인터 변수
  int i;

  fp = Sum;
  i = fp(2, 3);
  printf("%d \n", i);
}
[/code]

실행파일이 메모리에 로드되면 함수나 변수들이 고유한 메모리 주소를 가지게 된다. 이렇게 함수나 변수의 실제 주소를 결정하는 것을 바인딩이라고 한다.