2013-06-09 8 views
21

सी ++ में, public का अर्थ उन सदस्यों से है जहां ऑब्जेक्ट दिखाई दे रहा है, private का अर्थ है कि सदस्य केवल उसी वर्ग के अन्य सदस्यों या उनके दोस्तों से ही पहुंच योग्य हैं।क्या यह क्यूटी में निजी स्लॉट के बजाय सार्वजनिक स्लॉट का उपयोग करके कोई फर्क पड़ता है?

लेकिन क्यूटी में, private slots और public slots में अंतर मौजूद नहीं है। मैंने हाल के दिनों में क्यूटी लिखना शुरू कर दिया है, और मैंने हर समय private slots का उपयोग किया था।

किसी ने मुझे बताया कि मुझे इसके बजाय public slots का उपयोग करना चाहिए। तो अब मैं परेशान हूँ। मुझे क्यूटी के दस्तावेज़ों में संदर्भ जानकारी नहीं मिल रही है।

दो प्रकारों के बीच वास्तविक अंतर क्या है?

+0

[क्यूटी "निजी स्लॉट्स:" यह संभव डुप्लिकेट [क्यूटी "निजी स्लॉट:" यह क्या है?] (http://stackoverflow.com/questions/9147636/qt-private-slots-what-is- यह) – kolen

उत्तर

14

संकलित समय पर संकलक द्वारा निजी/सार्वजनिक पहुंच "चेक" की जाती है, लेकिन सिग्नल-स्लॉट कनेक्शन रन-टाइम पर किया जाता है और कुछ QMetaObject तंत्र (उदाहरण के लिए invokeMethod) द्वारा स्लॉट का आह्वान किया जाता है।

तो अंतर यह है: निजी स्लॉट्सनिजी कर रहे हैं नियमित सदस्य कार्यों के रूप में कहा जाता है, लेकिन हमेशा "सार्वजनिक" संकेतों को लागू करने के लिए, एक अच्छा कारण है क्योंकि स्लॉट धारणात्मक, सार्वजनिक इंटरफ़ेस हैं उनके मुख्य के बाद से उद्देश्य अंतर-वस्तु संचार

कुछ संबंधित "अजीब" सामानों के बारे में एक और उदाहरण निजी आभासी कार्यों का आह्वान है यदि वे विधि को कॉल करने के लिए उपयोग किए जाने वाले सूचक के स्थिर प्रकार में सार्वजनिक हैं।

+6

छोटे परिशिष्ट: वास्तव में निजी स्लॉट के लिए कोई भी (अनियंत्रित, आंतरिक) 'Q_PRIVATE_SLOT' तंत्र का उपयोग कर सकता है, जो स्लॉट को किसी अन्य में परिभाषित करने की अनुमति देता है - आमतौर पर निजी श्रेणी । – peppe

+0

@peppe मुझे Q_PRIVATE_SLOT के बारे में पता नहीं था, धन्यवाद – Zlatomir

25

Qt Documentation से:

के बाद से स्लॉट्स सामान्य सदस्य कार्य हैं, वे सामान्य सी ++ नियम जब सीधे बुलाया का पालन करें। हालांकि, स्लॉट के रूप में, उन्हें सिग्नल-स्लॉट कनेक्शन के माध्यम से, इसके पहुंच स्तर के बावजूद किसी भी घटक द्वारा बुलाया जा सकता है। इसका मतलब यह है कि एक मनमानी वर्ग के उदाहरण से उत्सर्जित एक सिग्नल एक असंबंधित वर्ग के उदाहरण में एक निजी स्लॉट लागू किया जा सकता है।

इसका मतलब क्या है: अन्य वर्ग से, आप एक समारोह के रूप में एक निजी स्लॉट को कॉल नहीं कर सकते हैं, लेकिन अगर आप एक संकेत है कि निजी स्लॉट से जुड़े फेंकना, आप इसे आह्वान कर सकते हैं।

3

@ user2448027 जवाब सही है, लेकिन क्योंकि, वहाँ क्यूटी के डिजाइन पैटर्न और विभिन्न अनुप्रयोगोंprivate slots vs. सार्वजनिक slots` की कहीं और का उल्लेख नहीं है में एक लापता है, मैं, इस पुराने विषय का जवाब करने का फैसला किया: स्लॉट निजी बनाकर आप ऑब्जेक्ट के उपयोगकर्ता को स्लॉट को कॉल करने के लिए कनेक्ट फ़ंक्शन का उपयोग करने के लिए मजबूर करते हैं। या - ऑपरेटर

कल्पना करें कि आपने अपनी कक्षा के स्लॉट में से एक में धीमा या अवरुद्ध कोड लागू किया है और आप कक्षा के उपयोगकर्ता को बनाए गए ऑब्जेक्ट को थ्रेड पर ले जाने की उम्मीद करते हैं, इसलिए इसके स्वामी वर्ग ऑब्जेक्ट (जो जीयूआई या जीयूआई से संबंधित कुछ ऑब्जेक्ट हो सकता है) इस स्लॉट को कॉल करके फ्रीज या ब्लॉक नहीं करेगा। यहां बताया गया है कि यदि . या -> ऑपरेटरों का उपयोग कर सीधे स्लॉट पर कॉल किया गया है, तो यह अवरुद्ध होगा। क्योंकि कॉलर विधि का वर्तमान धागा स्लॉट का उपयोग करेगा, और यह तभी होगा जब आपने सार्वजनिक स्लॉट का उपयोग किया हो। समाधान स्लॉट निजी बनाना है ताकि उपयोग केवल कनेक्शन के माध्यम से इसे सीधे कॉल कर सके।

निष्कर्ष:

  • आप स्लॉट अवरुद्ध किया है, तो उन्हें निजी स्लॉट के रूप में लागू करने के लिए सुनिश्चित करें।
  • अगर स्लॉट्स वस्तु के लिए संपत्ति का सरल सेटिंग्स के रूप में उपयोग किया जाता है उन्हें सार्वजनिक स्लॉट्स
  • बनाने
  • अंत में अगर आप वापसी मान या अस्थिर संदर्भ तर्क whith कुछ तरीकों की जरूरत है यहां तक ​​कि उन्हें स्लॉट नहीं बनाते हैं (यह बकवास है) , केवल सार्वजनिक है
संबंधित मुद्दे