Microsoft MVP성태의 닷넷 이야기
VC++: 16. 클래스 멤버 함수에 대한 포인터를 받는 표현. [링크 복사], [링크+제목 복사],
조회: 19256
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  [187]  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
429정성태12/31/200633921    답변글 개발 환경 구성: 18.11. 서비스를 위한 인증서 설치
352정성태10/2/200623456개발 환경 구성: 17. VPC에 Linux 설치하는 방법 [1]
351정성태10/8/200625936개발 환경 구성: 16. 성태의 무식한(!) 리눅스 탐방기. [4]
349정성태9/26/200624327디버깅 기술: 10. C++/CLI에서 제공되는 명시적인 파괴자의 비밀
347정성태10/6/200628398디버깅 기술: 9. .NET IDisposable 처리 정리 [1]
346정성태9/23/200621713개발 환경 구성: 15. 툴박스에 컨트롤이 자동으로 나타나도록 해주는 옵션 설정
345정성태9/20/200620880오류 유형: 12. WCF 오류 메시지 - Error while trying to reflect on attribute 'MessageContractAttribute'
343정성태10/18/200632799개발 환경 구성: 14. SandCastle 사용법 (NDoc을 대체하는 문서화 도구) [1]파일 다운로드1
344정성태9/20/200622922    답변글 개발 환경 구성: 14.1. 오류 유형 - GAC 에 등록된 DLL 에 대한 문서화 시 오류
340정성태9/15/200622204개발 환경 구성: 13. ISO 파일을 가상 CD-ROM으로 매핑해주는 프로그램
339정성태9/14/200621716오류 유형: 11. ProtocolsSection?
338정성태2/4/200729898개발 환경 구성: 12. BUG: 웹 서비스에서 DataTable 사용하기 [2]파일 다운로드1
350정성태10/2/200623198    답변글 개발 환경 구성: 12.1. ASMX 2.0 and SchemaImporterExtensions파일 다운로드1
335정성태8/20/200630731디버깅 기술: 8. COM+ 서버 응용 프로그램에 대한 F5 디버깅 방법
334정성태8/20/200626113디버깅 기술: 7. VS.NET 2003/2005의 다중 프로젝트 디버깅
333정성태8/20/200626423개발 환경 구성: 11. COM+ 서버 활성화 보안 설정
331정성태8/27/200619374개발 환경 구성: 10. 최대 절전 모드와 VPC 네트워크 문제
330정성태8/20/200619742개발 환경 구성: 9. VPC로 구성하는 개인 환경
328정성태8/20/200637728개발 환경 구성: 8. AppVerifier 사용법 [1]
327정성태8/16/200634596개발 환경 구성: 7. ActiveX 서명 과정 자동화 [1]
326정성태8/16/200628532Team Foundation Server: 13. Sysnet 웹 사이트 TFS Migration
322정성태8/15/200623209개발 환경 구성: 6. 4GB 메모리 구성 [1]
316정성태9/20/200642525디버깅 기술: 6. .NET 예외 처리 정리 [6]
309정성태12/27/200643398디버깅 기술: 5. PDB 이야기 [7]
310정성태8/5/200630195    답변글 디버깅 기술: 5.1. PDB 파일에 따른 Debug 정보 - WinForm + Library 유형의 프로젝트파일 다운로드1
311정성태8/10/200629694    답변글 디버깅 기술: 5.2. PDB 파일에 따른 Debug 정보 - .NET 2.0 Web Application Project + Library 유형의 프로젝트
... 181  182  183  184  185  186  [187]  188  189  190  191  192  193  194  195  ...