|
출처를 밝히는걸 까먹었군요 -_-;
기존 회사(루키온소프트)에서 사용하던 라이브러리를 제 입맛에 맞게 바꾼상태입니다.
게임엔진에서 사용하던것인데 제가 이름만 쬐꿈 바꿨답니다 ㅋㅋ.... ㅋ_ㅋ;;
제가 사용하는 FunClass 인데요 소스를 올리도록 하지요
템플릿으로 구현된것입니다.
첨부터 올리지 않은 이유는 별다른 이유없이 ㅠ.ㅠ
답이 아니라 방법을 통해 답을 드리고자하는 제 답변작성 방식에 비롯된것이니 노여워 마시기 바랍니다.
^^
덧붙이는 말로....
스태틱으로 선언하게되면 포인터대입시 new 로 생성하지 않아도 되는 편리함이 있는것은 사실입니다.
실제 템플릿으로 선언하게되면 해당함수을 호출하기 위해서는 new로 해당 메모리를 생성하게되는데요
이 방법은 빌더에서 사용하고 있는 방법이라고 알고있습니다. ( 정확한건 아니랍니다 -_- 혼자만의 생각 )
namespace SooyaLibrary
{
namespace Pattern
{
// 클래스별 Function 포인터를 담기위한 Base Class
// execute에 넘겨줄 파라미터를 템플릿으로 설정
template <class ParamType, class ReturnType = void>
class STFuncBase
{
public:
virtual ReturnType Execute(ParamType *pData)=0;
};
// 실제 STFuncClass, 클래스 포인터와 Function 포인터를 저장한다.
template <class ClassType, class ParamType, class ReturnType = void>
class STFuncClass : public STFuncBase <ParamType, ReturnType> // 포함클레스와 execute에 넘겨줄 파라미터를 템플릿으로 설정
{
private:
ReturnType (ClassType::*m_fp)(ParamType *pData);
ClassType* m_pClass;
public:
STFuncClass(ClassType* pClass, ReturnType (ClassType::*fp)(ParamType *pData))
{
m_pClass = pClass;
m_fp = fp;
}
ReturnType ReleasedClass()
{
m_pClass = NULL;
m_fp = NULL;
}
virtual ReturnType Execute(ParamType *pData)
{
if(m_pClass)
return (*m_pClass.*m_fp)(pData);
return (ReturnType) NULL;
}
};
}
}
사용하는 방법입니다.
#define SooyaCreateEvent(__Form, __Func) \
new SooyaLibrary::Pattern::STFuncClass<__Form, TObject> (this, &__Form::__Func)
typedef SooyaLibrary::Pattern::STFuncBase< TObject, void > LPFNCallTo;
LPFNCallTo *m_fcCallTo;
m_fcCallTo = SooyaCreateEvent( TForm1, Button2Click ); // Button2Click 는 __fastcall 선언되면 안됨
m_fcCallTo->Execute( Sender );
부디 알아보실 수 있으시다면 좋겠습니다... ㅠ.ㅠ
디자인패턴을 보시면 원하시는 부분에 이해를 돕는 글이 많이 있습니다.
책도 한번 보시는것도 좋을거 같다는 의견드리면서
답변을 마치도록 하겠습니다.
EmptySpear 님이 쓰신 글 :
:
: 먼저 답변해 주신 수야!╋님과 소리바람.OJ님 고맙습니다!
:
: 그런데 아쉽게도 원하는 답변과 조금 어긋난것은 맞군요..
:
: 수야님꺼는 static으로 멤버함수를 선언해야 일반 함수포인터에 대입해 사용할 수 있다는 말이고
:
: 소리바람님꺼는 인자전달에 템플리트를 사용한다는 내용아닌가요??
:
: 두분다 영문링크를 걸어놓으셔서 잘못 해석할 수도 있겠지만..
:
: 가급적이면 한국말(^^)로 더 도움 주세요...ㅠㅠ
:
: 그리고 두분이 찾아주신 자료도 유용히 참고 하겠습니다.
:
:
|