सिग्नल का दूसरा पैरामीटर एक इंट को स्वीकार करने और शून्य लौटने वाले फ़ंक्शन के लिए सूचक होना चाहिए। जो आप सिग्नल में जा रहे हैं वह सदस्य फ़ंक्शन को एक इंट और रिटर्निंग शून्य (इसके प्रकार void (myClass::*)(int)
) को स्वीकार करने वाला एक सूचक है। मैं तीन संभावनाएं देख सकते हैं इस मुद्दे पर काबू पाने के लिए:
1 - अपने विधि myHandler
स्थिर हो सकता है: इस महान है, यह स्थिर
class myClass
{
public:
void myFunction()
{
signal(SIGIO, myClass::myHandler);
}
static void myHandler (int signum)
{
// handling code
}
};
2 - अपने विधि स्थिर नहीं होना चाहिए: यदि आप ' केवल एक उदाहरण के साथ सिग्नल का उपयोग करने की योजना बना रहे हैं, आप एक निजी स्थैतिक वस्तु बना सकते हैं, और एक स्थिर विधि लिख सकते हैं जो इस ऑब्जेक्ट पर विधि को कॉल करे।
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);
लेकिन करने के लिए एक कॉल करना मुझे लगता है कि यदि आप अंतिम समाधान का उपयोग करते हैं, तो आपको शायद अपने हैंडलिंग डिज़ाइन को बदलने के बारे में सोचना चाहिए :-)!
स्रोत
2008-12-05 16:56:20
, खबरदार कि सिग्नल threadsafe नहीं कर रहे हैं, ताकि आप इस अगर necesarry –
कारण आप (जैसा कि नीचे वर्णित एक स्थिर विधि का उपयोग करने की जरूरत है) पर पुनर्विचार करने के लिए नहीं चाहते हो सकता है, कि एक विधि आप एक उदाहरण की जरूरत है कॉल करने के लिए है कक्षा (एक वस्तु) के। किसी ऑब्जेक्ट को सिग्नल करने के लिए पास करने का कोई तरीका नहीं है, इसलिए यह एक सामान्य फ़ंक्शन पॉइंटर होना चाहिए (विधि पॉइंटर नहीं)। –
@ रॉबर्ट गोल्ड: सच; लेकिन इस विषय के लिए वास्तव में प्रासंगिक नहीं है। –