A 클래스 함수내에서 함수포인터로 넘어온 함수를 실행시키기 위해선
A 클래스의 this 포인터로 넘어온(또는 인자로 받은) 함수포인터 타입을 실행 시켜야 한다
fn 이 함수 포인터 타입이고 어떤 함수가 A의 소식이면서 fn 의 변수로 넘어왔을때
A에선
void method{
(this->*fn)();
}
으로 호출하면 된다
괄호가 중요!
http://blog.naver.com/sorkelf?Redirect=Log&logNo=40135728128
함수포인터이긴 하지만
클래스에 멤버함수를 함수포인터로 호출 하려면 어떻게 할까?
함수포인터도 어디까지 포인터이므로
멤버함수의 주소를 넘겨 주되 클래스에 소속되어 있으므로
클래스의 scope 연산자 (::)를 반드시 명시해야 한다
또한 어디까지나 멤버함수이므로 함수포인터로 호출시에도
반드시 해당하는 그의 객체가 존재해야 한다
백문이 불여일견.. 코드를 보는게 빠를 듯..
http://www.cyworld.com/blue_wons/7209444
[STL 응용] Map으로 문자열과 함수포인터 매핑하기.
참고 출처 : http://stackoverflow.com/questions/630920/store-pointers-to-member-function-in-the-map [스택오버플로우]
@ 이것을 보게된 계기
cmd창에 명령어를 if else 구문으로 처리하다가, 좀더 깔끔하면서도 관리되는 방식의 명령어 정리는 하지 못할까라는 생각을 했고
명령어가 많아질수록 제어구문의 길이도 길어지는것을 감안하여 검색하던중, 스택오버플로우에 정확한 구현내용을 포착
이에 한번 따라서 만들어봤습니다. 위 참고 출처에는 클래스 객체 자신 내부함수를 참조하는 것이 아니기때문에
비교하면서 봐야 합니다.
#include <map>
#include <iostream>
#include <string>
class Type
{
typedef void (Type::*FuncPointer)();
typedef map<std::string, FuncPointer > FuncMap;
typedef map<std::string, FuncPointer>::iterator FuncMapIter;
FuncMap _funcMap;
FuncMapIter _pos;
string buff;
public:
Type(){};
~Type(){};
LoadFunc()
{
//왼쪽 값이 key 이면서 first, 오른쪽 값이 value 이면서 second
_funcMap["Start"] = &Type::Start; //굳이 이런식으로 넣지 않아도 된다.
//_funcMap.Insert(make_pair("Start", &Type::Start)); //이렇게 쑤셔박아도 된다.
}
ActivateFunction()
{
cin>>buff;
_pos = funcMap.find(buff);
if(_pos != funcMap.end())
{
FuncPointer func = _pos->second;
(this->*func)(); //참조할때가 가장 중요하다.
//이것은 자기 자신 내부라서 (this->*func)() 이런식으로 참조를 했지만
//객체 포인터가 아닌경우 (name).*func() 이런식으로 참조가 가능하다.
//자칫 잘못하면, 컴파일러가 잘못된 참조 갯수*3배만큼 애러를 토한다.
}
}
}
private:
void Start(){ std::cout<<"Start function !"<<std::endl;
}
반응형
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
부동소수점과 다른 형과의 변환을 사용하는 이유 (0) | 2012.11.01 |
---|---|
DWORD -> float 로 변환과 그 역 (0) | 2012.11.01 |
UINT_PTR (32비트 및 64비트 호환 포인터연산) (0) | 2012.11.01 |
행렬 배열레퍼런스 비트연산으로 가져오기 아이디어 (0) | 2012.11.01 |
이름없는 union 과 struct 로 행렬클래스 생성 아이디어 (1) | 2012.11.01 |