C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[40464] 원하시는 답변일겁니다.. -_-;;
수야!╋ [sooya23] 1185 읽음    2005-06-08 17:28
출처를 밝히는걸 까먹었군요 -_-;

기존 회사(루키온소프트)에서 사용하던 라이브러리를 제 입맛에 맞게 바꾼상태입니다.

게임엔진에서 사용하던것인데 제가 이름만 쬐꿈 바꿨답니다 ㅋㅋ.... ㅋ_ㅋ;;


제가 사용하는 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으로 멤버함수를 선언해야 일반 함수포인터에 대입해 사용할 수 있다는 말이고
:
: 소리바람님꺼는 인자전달에 템플리트를 사용한다는 내용아닌가요??
:
: 두분다 영문링크를 걸어놓으셔서 잘못 해석할 수도 있겠지만..
:
: 가급적이면 한국말(^^)로 더 도움 주세요...ㅠㅠ
:
: 그리고 두분이 찾아주신 자료도 유용히 참고 하겠습니다.
:
:

+ -

관련 글 리스트
40454 아무 클래스 멤버 함수를 가르키는 함수포인터 선언방법이 있을까요? EmptySpear 1615 2005/06/08
40468     Re:아무 클래스 멤버 함수를 가르키는 함수포인터 선언방법이 있을까요? Batman 1713 2005/06/08
40456     원하시는 답변은 아니랍니다.. -_-;; 수야!╋ 1040 2005/06/08
40458         Re:원하시는 답변은 아니랍니다.. -_-;; 소리바람.OJ 1004 2005/06/08
40460             Re:Re:원하시는 답변은 아니랍니다.. -_-;; EmptySpear 921 2005/06/08
40464                 원하시는 답변일겁니다.. -_-;; 수야!╋ 1185 2005/06/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.