いちばんやさしいゲームの作り方

文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ

…で、ファイナルアンサーだろうか。

確かに、何を基準に型を自動判別すればいいのかという基本的な疑問があります。ヘルパー関数というのはそのために作るのだろうか。

#include <iostream>




class IEventHandler
{
public:
  virtual ~IEventHandler() {}
  virtual void operator()() const = 0;
};



template <class T>
class EventHandler : public IEventHandler
{
public:
  typedef void (T::*Method)();
private:
  T      *object;
  Method  method;
public:
  EventHandler(T *object, Method method);
  virtual void operator()() const;
};

template <class T>
EventHandler<T>::EventHandler(T *object, Method method) : object(object), method(method)
{
}

template <class T>
void EventHandler<T>::operator()() const
{
  (this->object->*this->method)();
}

template <class T>
IEventHandler *CreateEventHandler(T *object, typename EventHandler<T>::Method method)
{
  return new EventHandler<T>(object, method);
}



class Unko
{
public:
  void geri();
};

void Unko::geri()
{
  std::cout <<"下痢したぜ!" <<std::endl;
}



class Chinco
{
public:
  void daaa();
  void daaa0000();
};

void Chinco::daaa()
{
  std::cout <<"だぁぁぁぁ!" <<std::endl;
}

void Chinco::daaa0000()
{
  std::cout <<"だぁぁぁぁああああああああああああ!" <<std::endl;
}



int main(int argc, char *argv[])
{
  IEventHandler *handlers[3];

  Unko   *unko   = new Unko();
  Chinco *chinco = new Chinco();

  handlers[0] = CreateEventHandler(unko, &Unko::geri);
  handlers[1] = CreateEventHandler(chinco, &Chinco::daaa);
  handlers[2] = CreateEventHandler(chinco, &Chinco::daaa0000);

  for (int i = 0; i <(sizeof(handlers) / sizeof(IEventHandler *)); i++) {
    (*handlers[i])();
  }

  for (int i = 0; i <(sizeof(handlers) / sizeof(IEventHandler *)); i++) {
    delete handlers[i];
  }

  delete chinco;
  delete unko;

  return 0;
}

ここでいう CreateEventHandler() 関数がそれです。こいつのおかげでクラスを作るのに型を指定しなくて良いようになっています。もちろん new EventHandler<Unko>(unko, &Unko::geri) って書けば良いんですけど、それが悔しい人向け。

余談ですが、イベントハンドラはスマートポインタに渡した方がいいんじゃねぇか論が熱いですね。

Contributions




Trackback URL

メルマガ登録・解除
 
挫折不可能!初級ゲームプログラミング完全マニュアル
RSS track feedいちばんやさしいゲームの作り方 カウンター
ブログSEO対策:track word あわせて読みたい SEO STATUS