2011-12-21 19 views
5

के रूप में पॉइंटर-टू-सदस्य-फ़ंक्शन पास करना तो यहां स्थिति है: मैं संयोजन के साथ सी ++, एसडीएल और जीएलकंसोल का उपयोग कर रहा हूं। मेरे पास कक्षा है, SDLGame, जिसमें Init(), Loop(), Render() आदि है - अनिवार्य रूप से, यह मेरे गेम क्लास के लिए तर्क रखता है।
जीएलकंसोल अब तक एक अच्छी लाइब्रेरी है - यह मुझे मेरे एसडीएल कक्षा के अंदर भी सीवीआर और ऐसे परिभाषित करने देता है। हालांकि, जब आदेशों को परिभाषित करने, मैं एक ConsoleFunc है, जो के रूप मेंपॉइंटर-टू-फ़ंक्शन

typedef bool (*ConsoleFunc)(std::vector<std::string> *args); 

सरल पर्याप्त typedef'd है निर्दिष्ट करना होगा। हालांकि, जैसा कि मैंने कहा, मेरे कार्य मेरी कक्षा में हैं, और मुझे पता है कि मैं पॉइंटर-टू-फ़ंक्शन तर्कों के रूप में पॉइंटर-टू-क्लास-फ़ंक्शंस पास नहीं कर सकता। मैं स्थिर कार्यों को परिभाषित नहीं कर सकता या अपनी कक्षा के बाहर कार्य नहीं कर सकता क्योंकि इनमें से कुछ कंसोलफंक्स को कक्षा डेटा सदस्यों को उपयोगी होने के लिए उपयोग करना चाहिए। मैं इसे ओओपी रखना चाहता हूं, ठीक है, ओओपी अच्छा है।

ठीक है, मुझे वास्तव में यह समस्या "हल" है - लेकिन यह बेहद बदसूरत है। मेरे पास सिर्फ SDLGame का एक उदाहरण है जो एक बाहरी चर के रूप में घोषित किया गया है, और मेरे कंसोलफंक्स/मुख्य श्रेणी में इसका उपयोग करें।

तो, सवाल यह है: क्या ऐसा करने का कोई तरीका है जो बेवकूफ और बेवकूफ नहीं है जैसा मैं कर रहा हूं? (वैकल्पिक रूप से: क्या कोई कंसोल लाइब्रेरी है जो GLConsole है जो एसडीएल का समर्थन करता है और जो मैं वर्णन कर रहा हूं वह कर सकता हूं?)

उत्तर

7

यदि आपके पास एकमात्र इंटरफ़ेस है जो फ़ंक्शन पॉइंटर है, तो आप खराब हो जाते हैं।

एक सदस्य समारोह एक this सूचक कहा जाता है की जरूरत है, और आप गुजर कि का कोई रास्ता नहीं है, तो आप भाग्य से बाहर हो (मुझे लगता है कि std::vector<std::string>* args सूचक क्या आप पुस्तकालय से पारित कर दिया हो जाता है)।

दूसरे शब्दों में, भले ही वह पुस्तकालय सी ++ कंटेनर का उपयोग करता है, यह एक अच्छा सी ++ लाइब्रेरी नहीं है, क्योंकि यह कॉलबैक के लिए मुफ्त कार्यों पर निर्भर करता है। एक अच्छी सी ++ लाइब्रेरी boost::function या कुछ समान, या कम से कम पर उपयोग करेगी, तो आप void* user_data पॉइंटर को अपने कॉलबैक से गुजरने दें। यदि आपके पास ऐसा था, तो आप अपनी कक्षा के this पॉइंटर को पास कर सकते हैं, इसे वापस कॉलबैक के अंदर डालें, और उचित सदस्य फ़ंक्शन को कॉल करें।

+0

अच्छी तरह से डांग। फिर भी धन्यवाद। उपयोग करने के लिए किसी अन्य पुस्तकालय के लिए कोई सुझाव मिला? मैं OGLConsole देख रहा था, लेकिन यह एक ही समस्या है। – Chaosed0

+0

@user: क्षमा करें, कोई पुस्तकालय सुझाव नहीं। :/ – Xeo

+0

मैं दृढ़ता से 'शून्य *' "उपयोगकर्ता डेटा" के उपयोग की अनुशंसा करता हूं। निश्चित रूप से, यह एक आधुनिक भाषा 'प्रतिनिधि' के रूप में सुंदर नहीं है, लेकिन यह एक सुरक्षित तरीका है क्योंकि यह आपका कोड है जो कॉलबैक और उपयोगकर्ता डेटा को एक जोड़ी के रूप में पंजीकृत करता है। इसलिए, आने वाले 'शून्य *' को उपयुक्त वर्ग प्रकार में डालने के लिए 100% सुरक्षित है क्योंकि कॉलबैक उस इरादे से दिमाग में सेट है। – TheBuzzSaw