누를 때 사용자 정의 함수를 호출하는 간단한 버튼 클래스를 만드는 방법. 일부 코드 예 :
class Button
{
public:
Button();
Draw();
Press();
SetCallback(void(*cback)());
priate:
void (*callback)();
}
void Button::SetCallback(void(*cback)())
{
callback = cback;
}
class GameState
{
...
}
class MenuState : public GameState
{
Button *btn;
}
class Game
{
...
}
bool Game::Init()
{
std::unique_ptr<GameState> menu = std::unique_ptr<MenuState>(new MenuState);
}
void Game::PopState(){
states.pop_back();
}
이 예제에서 버튼의 콜백을 Game :: PopState () 함수로 설정하는 방법. 그런 다음 Game :: PopState 함수를 호출하는 버튼을 누릅니다.
당신이 찾고있는 것은 여기 에서 찾을 수있는 함수 포인터에 대한 튜토리얼입니다 .
인수를 전달해야하는 경우 멤버 함수에는 참조 (함수 호출을 소유 한 개체)가 필요하므로 단추 함수 포인터에 포인터 또는 Game 개체에 대한 참조가 있어야합니다. Game 클래스의 popstate 함수가 비공개 인 경우 공개 또는 친구 함수로 만들어야 할 수 있습니다.
문자열 참조를 Game 객체에 대한 참조로 대체하여 아래 예제를 수정할 수 있어야합니다. 좀 더 일반적인 콜백이 필요한 경우 템플릿 (더 좋지만 조금 더 복잡함)을 살펴 보거나 punning ( 일반적으로 나쁜 습관으로 간주 됨 )을 입력합니다.
#include <iostream>
#include <string>
class Button
{
public:
void SetCallback(void(*cback)(std::string&));
void Press(std::string str){
//Make sure some sort of check is done in order to prevent undefined behavior from a call
if(callback != nullptr)
callback(str);
}
Button(){
callback = nullptr;
}
private:
void (*callback)(std::string&);
};
void Button::SetCallback(void(*cback)(std::string&))
{
callback = cback;
}
//Method 2 for calling function
void DoStuff(std::string& str){
std::cout << str;
}
int main(void){
Button btn;
//Method 1 for calling function, replace body with Game.PopStates();
auto foo = [](std::string& str){ std::cout<<str.size();};
btn.SetCallback(foo);
btn.Press("A");
//Method 2 for calling function
btn.SetCallback(&DoStuff);
btn.Press("\nPressed Button");
return 0;
}
Game에 대한 함수 포인터는 다음과 같아야합니다.
void SetCallback(void(*cback)(Game&));
다음과 같이 부를 수 있습니다.
auto foo = [](Game& g){ g.DoStuffInClass(); };
btn.SetCallback(foo);
btn.Press(game);
위의 예제는 정상적으로 작동하며 일반적으로 수행해야 할 모든 작업이지만 여기 에서는 멤버 함수 포인터에 대해 더 자세히 설명합니다. 기사의 주요 내용은 typedef가 다음과 같이 멤버 함수 포인터를 작성하는 또 다른 방법입니다.
typedef int (Fred :: * FredMemFn) (char x, float y); // 이것을하십시오!
그러나 위의 모든 작업은 (PopStates로 구현 될 때) 버튼 콜백을 게임 객체에서 호출하는 void 함수를 사용하도록 잠그는 것이므로 버튼 사용 기능이 제한됩니다. Game 개체없이 동작하는 특수한 경우를 허용하려는 경우 참조 대신 포인터를 사용할 수 있지만 어느 쪽이든 Game 개체가 콜백 내부에 삽입 될 방법을 찾아야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다