signalの2番目のパラメーターは、intを受け入れてvoidを返す関数へのポインターである必要があります。シグナルに渡すのは、intを受け入れてvoidを返すメンバーvoid (myClass::*)(int)
関数へのポインターです(その型は)。この問題を克服するための3つの可能性を見ることができます。
1-メソッドmyHandler
は静的にすることができます:これは素晴らしいです、静的にします
class myClass
{
public:
void myFunction ()
{
signal(SIGIO, myClass::myHandler);
}
static void myHandler (int signum)
{
// handling code
}
};
2-メソッドは静的であってはなりません。1つのインスタンスのみでsignalを使用することを計画している場合は、プライベート静的オブジェクトを作成し、このオブジェクトのメソッドを呼び出すだけの静的メソッドを作成できます。の線に沿った何か
class myClass
{
public:
void myFunction ()
{
signal(SIGIO, myClass::static_myHandler);
}
void myHandler (int signum)
{
// handling code
}
static void static_myHandler(int signum)
{
instance.myHandler(signum);
}
private:
static myClass instance;
};
3-ただし、複数のインスタンスでシグナルを使用することを計画している場合は、事態はさらに複雑になります。おそらく解決策は、操作する各インスタンスを静的ベクトルに格納し、これらのそれぞれでメソッドを呼び出すことです。
class myClass
{
public:
void myFunction () // registers a handler
{
instances.push_back(this);
}
void myHandler (int signum)
{
// handling code
}
static void callHandlers (int signum) // calls the handlers
{
std::for_each(instances.begin(),
instances.end(),
std::bind2nd(std::mem_fun(&myClass::myHandler), signum));
}
private:
static std::vector<myClass *> instances;
};
そしてどこかで、
signal(SIGIO, myClass::callHandlers);
しかし、最後の解決策を使用することになった場合は、おそらくハンドリングの設計を変更することを検討する必要があると思います:-)!