C++ 함수 포인터에 관해 질문 있습니다.
글쓴이: greathero / 작성시간: 화, 2013/03/12 - 1:50오후
책을 보다가 std::tr1::function으로 함수 포인터를 쓰는 예제를 봤는데요.
이해가 안가는게 있어서 질문합니다.
class GameCharacter; int defaultHealth(const GameCharater& rhs); class GameCharacter { public: typedef std::tr1::function<int (const GameCharacter& rhs)> GetHealthFunc; // 함수 포인터 타입선언 explicit GameCharacter(GetHealthFunc hfc = defaultHealth) :healthFunc(hfc) { } int healthValue() const { return healthFunc(*this); } private: GetHealthFunc healthFunc; };
생성자에서 게임 캐릭터의 HP를 계산하는 함수 포인터를 넘기는건 알겠는데요.
(안 넘기면 defaultHealth로 일반적인 방법으로 게임 캐릭터의 HP를 계산하겠다는 것일테고요.)
그런데, healthValue 함수에서 왜 return healthFunc(*this);를 하나요?
이게 GameCharacter에 매핑된 HP 계산함수를 쓴다는 목적에서 작성된 함수일텐데...
return healthFunc(defaulthHealth); <- 이런식으로 써야되는거 아닌가요?
return healthFunc(*this); 이 문장이 문법적으로 이해가 가질 않습니다ㅠ 도와주세요...
Forums:
*this 는 객체가 자기자신을 값으로 어떤 함수에
*this 는 객체가 자기자신을 값으로 어떤 함수에 전달할 때 사용하는 것 아닌가요?
를 보았을 때 GetHealthFunc 은
의 다른 이름이고
아마 그것은 int (const GameCharacter& rhs) 형식의 함수 포인터인 듯 하고 그렇다면 그 함수는 인자로 const GameCharacter& rhs 를 받고요, *this 를 받을 수 있는 형식인 것 같습니다.
함수 포인터 타입선언의 형식이 좀 복잡하네요...
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
단순하게 생각하시면 됩니다. explicit
단순하게 생각하시면 됩니다.
explicit GameCharacter(GetHealthFunc hfc = defaultHealth)
:healthFunc(hfc) { }
여기 생성자에서 보듯이 생성자의 인자로 넘어오는 인자의 기본 값이 defaultHealth입니다.
인자로 안넘겨주면 기본 값을 쓰고 넘어오면 넘어온 것이 hfc로 넘어올겁니다. 뭐 어쨌든....
넘어오건 안넘어오건간에 일단 hfc는 뭔가 항상 값을 가지고 있습니다.
그걸 :healthFunc(hfc) 통해서 멤버 변수의 생성자를 호출하여 초기화 했습니다.
그럼 healthFunc이라는 변수의 타입을 봅시다.
GetHealthFunc healthFunc
이렇게 선언 되어있네요. healthFunc라는 것은 GetHealthFunc 타입을 가집니다.
그러면 GetHealthFunc 타입이 뭔지 봐야겠죠.
typedef std::tr1::function GetHealthFunc;
이렇게 해서 타입은 선언했습니다. 복잡하지만 그냥 간단하게 하면 int (const GameCharacter& rhs) 타입입니다. 즉 함수 포인터 타입이지요.
따라서 healthFunc는 함수 포인터입니다. 함수 포인터를 이용해서 함수 호출을 하려면 그냥 일반 함수 호출하듯이 healthFunc(인자); 이렇게 하면 됩니다.
그런데 저 함수 포인터가 인자로 취하는게 뭐죠? 인자로 받는 것이 GameCharacter& rhs이지요.
참조자로 받기 때문에 포인터가 아닌 값을 넘겨야합니다.
그런데 this는 포인터입니다. 자기 자신을 가르키는 포인터.
포인터가 가리키는 것의 값을 가져오려면 앞에 * 연산자를 붙여야합니다.
그래서 *this는 자기 자신값입니다.
그걸 GameCharacter& rhs으로 넘겨준 것입니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
댓글 달기