Microsoft MVP성태의 닷넷 이야기
VC++: 16. 클래스 멤버 함수에 대한 포인터를 받는 표현. [링크 복사], [링크+제목 복사],
조회: 17079
글쓴 사람
정성태 (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)
530정성태9/1/200722601.NET Framework: 94. WCF 예외에 대한 시행착오
529정성태8/31/200725433.NET Framework: 93. WCF - DataContract와 KnownType 특성 [1]
528정성태8/30/200720096오류 유형: 47. VPC - 네트워크 어댑터 MAC 주소 중복 오류
527정성태8/30/200730102Team Foundation Server: 20. 잠긴 파일을 강제로 해제 [2]
526정성태8/29/200720025오류 유형: 46. VS.NET 2008 - ASP.NET 디버깅 : Strong name validation failed.
525정성태8/27/200722318VS.NET IDE: 54. VS.NET 2008 - 새롭게 도입되는 XSD Schema Designer
524정성태8/23/200739831오류 유형: 45. 요청한 작업은, 사용자가 매핑한 구역이 열려 있는...
523정성태8/16/200722473VS.NET IDE: 53. VS.NET 2008 - 서비스 참조 시 기존 데이터 컨테이너 DLL 사용
522정성태8/13/200726096VS.NET IDE: 52. VS.NET 2008 - WCF를 위한 디버깅 환경 개선
521정성태8/8/200726238.NET Framework: 92. XmlSerializer 생성자의 실행 속도를 올리는 방법 - 두 번째 이야기 [3]
520정성태8/7/200721366VS.NET IDE: 51. Visual Studio 2008 베타 2 설치
519정성태7/27/200727733오류 유형: 44. System.BadImageFormatException [2]
518정성태7/26/200728683오류 유형: 43. System.ComponentModel.LicenseException [1]
517정성태7/19/200716963개발 환경 구성: 26. VPC - 일반 사용자 계정으로 구동
516정성태7/19/200720253오류 유형: 42. TFS - Error loading menu: Index was outside the bounds of the array [2]
515정성태7/18/200727926오류 유형: 41. SSL 서버 자격 증명을 만드는 동안 심각한 오류가 발생했습니다.
514정성태7/14/200720582Team Foundation Server: 19. Orcas에서 개선되는 TFS 기능들
513정성태7/4/200731563.NET Framework: 91. Foreground Thread / Background Thread [1]
512정성태6/27/200721636오류 유형: 40. error PRJ0050: Failed to register output.
511정성태6/25/200729564.NET Framework: 90. XmlSerializer 생성자의 실행 속도를 올리는 방법 [2]
510정성태6/25/200744439디버깅 기술: 15. First-Chance Exception
508정성태6/21/200727404Team Foundation Server: 18. Team Build에 사용되는 각종 Property 값 [4]
507정성태6/11/200725019VS.NET IDE: 50. Orcas - UAC 설정 관련
506정성태6/9/200720215오류 유형: 39. VC Package not available or not registered
505정성태6/9/200719799오류 유형: 38. Visual SourceSafe - DB 잠김 오류
504정성태6/9/200725104오류 유형: 37. Visual SourceSafe - Anaylze 도중 비정상 종료
... 166  167  168  169  170  171  172  173  174  175  176  177  [178]  179  180  ...