콜백으로 간단한 버튼 클래스를 만드는 방법은 무엇입니까?

JustOneMan

누를 때 사용자 정의 함수를 호출하는 간단한 버튼 클래스를 만드는 방법. 일부 코드 예 :

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 함수를 호출하는 버튼을 누릅니다.

Phles

당신이 찾고있는 것은 여기 에서 찾을 수있는 함수 포인터에 대한 튜토리얼입니다 .

인수를 전달해야하는 경우 멤버 함수에는 참조 (함수 호출을 소유 한 개체)가 필요하므로 단추 함수 포인터에 포인터 또는 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

플라스크에서 간단한 텍스트 필드와 제출 버튼으로 검색 상자를 만드는 방법은 무엇입니까?

분류에서Dev

버튼 클릭시 다른 클래스로 div를 만드는 방법은 무엇입니까?

분류에서Dev

간단한 호스팅 서버를 만드는 방법은 무엇입니까?

분류에서Dev

간단한 호스팅 서버를 만드는 방법은 무엇입니까?

분류에서Dev

DroidScript의 모든 버튼에 대해 다른 값으로 콜백 함수를 만드는 방법은 무엇입니까?

분류에서Dev

UIImageView를 버튼으로 만드는 방법은 무엇입니까?

분류에서Dev

이미지를 버튼으로 만드는 방법은 무엇입니까?

분류에서Dev

Node SDK로 결제를 수락하기위한 Paypal 버튼을 만드는 방법은 무엇입니까?

분류에서Dev

스레딩으로 인해 버튼 콜백은 한 번만 작동합니다.

분류에서Dev

콜백 클로저에서 버튼 자체를 사용하는 방법은 무엇입니까?

분류에서Dev

간단한 Python REST 서버 및 클라이언트를 만드는 방법은 무엇입니까?

분류에서Dev

가능한 여러 열거 형 유형으로 Codable 클래스를 만드는 방법은 무엇입니까?

분류에서Dev

Dart에서 간단한 튜플 클래스를 만드는 방법은 무엇입니까?

분류에서Dev

Java에서 정적 추상 클래스를 콜백으로 사용하는 방법은 무엇입니까?

분류에서Dev

버튼으로 정렬 가능한 위젯의 업데이트 콜백을 프로그래밍 방식으로 트리거하는 방법은 무엇입니까?

분류에서Dev

sklearn으로 다항 회귀를 만드는 가장 간단한 방법은 무엇입니까?

분류에서Dev

Firefox에서 JQM으로 만든 버튼을 클릭 할 수있게 만드는 방법은 무엇입니까?

분류에서Dev

한 번의 버튼 클릭으로 두 개의 인 텐트를 사용하는 방법은 무엇입니까?

분류에서Dev

버튼 클릭으로 인한 타이머를 중지하는 방법은 무엇입니까?

분류에서Dev

일반적인 방법으로 클릭 한 버튼을 확인하는 방법은 무엇입니까?

분류에서Dev

GWT GXT에서 메뉴 (간단한 버튼)를 작성하는 방법은 무엇입니까?

분류에서Dev

비슷한 클래스를 함께 결합하거나 함수로 만드는 방법은 무엇입니까?

분류에서Dev

버튼 클릭으로 texField를 여는 방법은 무엇입니까?

분류에서Dev

버튼 클릭으로 인한 Android 앱 충돌을 방지하는 방법은 무엇입니까?

분류에서Dev

Grafana에서 rrd 파일을 그래프로 만드는 가장 간단한 방법은 무엇입니까?

분류에서Dev

여러 버튼이 각도기에서 동일한 클래스를 갖는 경우 특정 버튼을 클릭하는 방법은 무엇입니까?

분류에서Dev

추상 클래스 멤버를 만드는 방법은 무엇입니까?

분류에서Dev

ViewController에 간단한 버튼을 추가하는 방법은 무엇입니까?

분류에서Dev

버튼을 클릭 한 후에 만 양식에 목록보기를로드하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    플라스크에서 간단한 텍스트 필드와 제출 버튼으로 검색 상자를 만드는 방법은 무엇입니까?

  2. 2

    버튼 클릭시 다른 클래스로 div를 만드는 방법은 무엇입니까?

  3. 3

    간단한 호스팅 서버를 만드는 방법은 무엇입니까?

  4. 4

    간단한 호스팅 서버를 만드는 방법은 무엇입니까?

  5. 5

    DroidScript의 모든 버튼에 대해 다른 값으로 콜백 함수를 만드는 방법은 무엇입니까?

  6. 6

    UIImageView를 버튼으로 만드는 방법은 무엇입니까?

  7. 7

    이미지를 버튼으로 만드는 방법은 무엇입니까?

  8. 8

    Node SDK로 결제를 수락하기위한 Paypal 버튼을 만드는 방법은 무엇입니까?

  9. 9

    스레딩으로 인해 버튼 콜백은 한 번만 작동합니다.

  10. 10

    콜백 클로저에서 버튼 자체를 사용하는 방법은 무엇입니까?

  11. 11

    간단한 Python REST 서버 및 클라이언트를 만드는 방법은 무엇입니까?

  12. 12

    가능한 여러 열거 형 유형으로 Codable 클래스를 만드는 방법은 무엇입니까?

  13. 13

    Dart에서 간단한 튜플 클래스를 만드는 방법은 무엇입니까?

  14. 14

    Java에서 정적 추상 클래스를 콜백으로 사용하는 방법은 무엇입니까?

  15. 15

    버튼으로 정렬 가능한 위젯의 업데이트 콜백을 프로그래밍 방식으로 트리거하는 방법은 무엇입니까?

  16. 16

    sklearn으로 다항 회귀를 만드는 가장 간단한 방법은 무엇입니까?

  17. 17

    Firefox에서 JQM으로 만든 버튼을 클릭 할 수있게 만드는 방법은 무엇입니까?

  18. 18

    한 번의 버튼 클릭으로 두 개의 인 텐트를 사용하는 방법은 무엇입니까?

  19. 19

    버튼 클릭으로 인한 타이머를 중지하는 방법은 무엇입니까?

  20. 20

    일반적인 방법으로 클릭 한 버튼을 확인하는 방법은 무엇입니까?

  21. 21

    GWT GXT에서 메뉴 (간단한 버튼)를 작성하는 방법은 무엇입니까?

  22. 22

    비슷한 클래스를 함께 결합하거나 함수로 만드는 방법은 무엇입니까?

  23. 23

    버튼 클릭으로 texField를 여는 방법은 무엇입니까?

  24. 24

    버튼 클릭으로 인한 Android 앱 충돌을 방지하는 방법은 무엇입니까?

  25. 25

    Grafana에서 rrd 파일을 그래프로 만드는 가장 간단한 방법은 무엇입니까?

  26. 26

    여러 버튼이 각도기에서 동일한 클래스를 갖는 경우 특정 버튼을 클릭하는 방법은 무엇입니까?

  27. 27

    추상 클래스 멤버를 만드는 방법은 무엇입니까?

  28. 28

    ViewController에 간단한 버튼을 추가하는 방법은 무엇입니까?

  29. 29

    버튼을 클릭 한 후에 만 양식에 목록보기를로드하는 방법은 무엇입니까?

뜨겁다태그

보관