Microsoft MVP성태의 닷넷 이야기
VC++: 16. 클래스 멤버 함수에 대한 포인터를 받는 표현. [링크 복사], [링크+제목 복사],
조회: 17062
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)
가끔, 멤버 함수 포인터를 다른 함수의 인자로 전달하고 싶었던 적이 있습니다.
사실 멤버 함수가 인스턴스에 종속되기 때문에 this 인자까지 같이 전달해야 하는 것을 생각해 보면, 그러한 의도는 잘못된 것입니다.

왜냐면, 그렇게 전달한 멤버함수를 호출하기 위해서는 this 인자까지 전달해야 하므로. 차라리 this 인자 하나를 전달하는 것으로 끝낼 수 있기 때문이죠. this->멤버함수()라고 호출하면 되니까요. ^^

그럼에도 불구하고, ... 그러한 문제를 한번 풀어봄으로써 좀 더 C++을 이해할 수 있는 좋은 기회가 아닐까 생각해 봅니다.


[참고로, 아래의 예제를 실행하기 위해서는 VS.NET 2005와 함께 나오는 VC++ 8.0이 필요합니다.
__thiscall 예약어에 대한 지원을 그 버전부터 하기 때문입니다.]

예를 들어, 시뮬레이션을 차에 대해서 하는 경우... 외부 환경의 지속적인 변화가 다음 행동에 대한 영향을 주어야 하는 경우.... 라고 가정해 봅시다.

class Car
{
private:

public:
    long Run1()  { return 계산값_다음 행동으로 이어지는 seed 제공; }
    long Run2()  { return 계산값_다음 행동으로 이어지는 seed 제공; }
    long Run3()  { return 계산값_다음 행동으로 이어지는 seed 제공; }
    long Run4()  { return 계산값_다음 행동으로 이어지는 seed 제공; }
};

typedef long (__thiscall *ThisRunFunc)(void * );
typedef long (Car::*ThisFunc)();

void TestCar()
{
 ThisFunc method[] = 
 {
  &Car::Run1,
  &Car::Run2,
  &Car::Run3,
  &Car::Run4,
 };

 int nCount = sizeof( method ) / sizeof( &Car::Run1 );

 ThisRunFunc *thisFunc = new ThisRunFunc[ nCount ];

 Car carInst;

 for ( int i = 0; i < nCount; i ++ )
 {
  void *func = (void *)*( __int64 *)&method[ i ];
  thisFunc[ i ] = (ThisRunFunc)func;
 }

 int nNext = 0;
 while ( true )
 {
  nNext = thisFunc[ nNext ]( &carInst );  
  if ( nNext == -1 )
  {
   break;
  }
 }

 delete [] thisFunc;
}

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  173  174  [175]  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
622정성태12/1/200831139오류 유형: 63. WPF - XamlParseException 대응 방법 [2]
621정성태11/30/200823352Team Foundation Server: 27. TeamBuild + VDPROJ 셋업 프로젝트 [1]
620정성태11/30/200822175디버깅 기술: 21. 올바른 이벤트 예외 정보 출력
619정성태11/30/200822239디버깅 기술: 20. 예외 처리를 방해하는 WPF Modal 대화창파일 다운로드1
618정성태11/29/200822811.NET Framework: 113. 이벤트에 속한 이벤트 핸들러 확인파일 다운로드1
617정성태11/26/200828309.NET Framework: 112. How to Interop DISPPARAMS [2]파일 다운로드2
616정성태11/26/200822096디버깅 기술: 19. C++/CLI - F11 디버깅 시의 변수 초기화파일 다운로드1
615정성태11/9/200831792.NET Framework: 111. WPF - Window, UserControl 클래스 상속 [1]
614정성태11/9/200831714.NET Framework: 110. WPF - 전역 예외 처리 [4]파일 다운로드1
613정성태11/8/200821346.NET Framework: 109. WPF - SystemColors 색상표파일 다운로드1
612정성태11/1/200826567.NET Framework: 108. WPF + WCF 환경에서는 DataContract를 권장 [1]
611정성태10/31/200820981오류 유형: 62. WPF - Visual Studio 2008 비정상 종료
610정성태10/24/200823165Team Foundation Server: 26. TFS 2008 SP1 + SQL Server 2008 설치
609정성태10/24/200826929.NET Framework: 107. WPF - RadioButton 데이터 바인딩 해제 현상파일 다운로드2
608정성태10/23/200821652오류 유형: 61. TFS 연결 오류: TF31003, TF30331 오류
607정성태10/18/200819494Windows: 32. 자동 실행 경로에 ".." 가 포함된 경우
606정성태10/18/200821510.NET Framework: 106. WCF - 다중 서비스 호스트파일 다운로드1
605정성태10/18/200824959.NET Framework: 105. WPF - 닫기 버튼을 없애려면.
604정성태10/18/200825505오류 유형: 60. System.Management.ManagementException - Generic failure [1]
602정성태10/15/200827423오류 유형: 59. WPF - XAML 로딩 시 Visual Studio 비정상 종료 [1]
600정성태10/9/200832146디버깅 기술: 18. TFS Team Build + Source Server = 소스 코드 디버깅 [3]
603정성태10/15/200824035    답변글 디버깅 기술: 18.1. 소스 서버 구성, 그 외의 이야기
599정성태10/5/200830012디버깅 기술: 17. TFS Team Build + Symbol Server [1]
598정성태10/3/200819997VS.NET IDE: 57. VS.NET 2008 - 다중 프로젝트에서 단일 SNK를 사용하는 방법
597정성태10/2/200818651Team Foundation Server: 25. VSTS 2008의 Build Explorer
596정성태10/2/200825396오류 유형: 58. WPF : 드롭다운 유형의 ComboBox가 펼쳐지지 않는 문제
... 166  167  168  169  170  171  172  173  174  [175]  176  177  178  179  180  ...