मैं जावा से सी ++ में जा रहा हूं और भाषा की लचीलापन में थोड़ा उलझन में हूं। एक बिंदु यह है कि वस्तुओं को स्टोर करने के तीन तरीके हैं: एक सूचक, एक संदर्भ और एक स्केलर (यदि मैं इसे सही ढंग से समझता हूं तो ऑब्जेक्ट को स्वयं संग्रहित करता है)।सी ++ में एक सूचक, स्केलर और संदर्भ कब वापस करें?
मैं जहां संभव हो संदर्भों का उपयोग करता हूं, क्योंकि यह जावा जितना संभव हो उतना करीब है। कुछ मामलों में, उदा। व्युत्पन्न विशेषताओं के लिए ही टिककर खेल, यह संभव नहीं है:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
यह संकलन नहीं करता, क्योंकि t
केवल getSomeAttribute()
के दायरे के भीतर मौजूद है और अगर मैं इसे करने के लिए एक संदर्भ लौटने के लिए, यह कहीं नहीं बात करने से पहले ग्राहक इसका इस्तेमाल कर सकते हैं ।
- वापसी एक सूचक
- वापसी एक अदिश
एक सूचक रिटर्निंग इस प्रकार दिखाई देगा:
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
यह
इसलिए मैं दो विकल्पों के साथ छोड़ दिया हूँ काम नहीं है, लेकिन क्लाइंट को NULL
के लिए इस पॉइंटर को जांचना होगा वास्तव में, कुछ ऐसा जो संदर्भों के साथ जरूरी नहीं है। एक और समस्या यह है कि कॉलर को यह सुनिश्चित करना होगा कि t
को हटा दिया गया है, अगर मैं इससे बच सकता हूं तो मैं इसके साथ सौदा नहीं करूँगा।
विकल्प वस्तु ही (अदिश) लौटने के लिए होगा:
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
कि बिल्कुल स्पष्ट है और बस क्या मैं इस मामले में चाहते हैं: यह एक संदर्भ की तरह लगता है और यह खाली नहीं रह सकती। यदि ऑब्जेक्ट क्लाइंट के कोड में दायरे से बाहर है, तो इसे हटा दिया जाता है। बहुत आसान हालांकि, मैं शायद ही कभी ऐसा कर रहा हूं, क्या इसका कोई कारण है? अगर कोई सूचक या संदर्भ के बजाय एक स्केलर लौटाता है तो क्या कोई प्रदर्शन समस्या है?
इस समस्या को संभालने के लिए सबसे आम/सुरुचिपूर्ण दृष्टिकोण क्या है?
"मैं जावा से सी ++ में जा रहा हूं" का अर्थ कुछ भी नहीं है। जावा सी ++ नहीं है। जावा कभी भी सी ++ नहीं होगा। जावा के बारे में सोचते समय प्रोग्रामिंग सी ++ आपको सी ++ को समझने में मदद नहीं करेगा या आपको अच्छे निर्णय लेने में मदद नहीं करेगा। कोई भी भाषा आपको सी ++ को छोड़कर अच्छा सी ++ प्रोग्राम करने में मदद नहीं करेगी, इसलिए आप किसी अन्य भाषा को भूल जाते हैं, क्योंकि वे सी ++ नहीं हैं। यदि आप सी ++ में प्रोग्राम करना चाहते हैं, तो आपको सी ++ सीखना होगा, सी ++ में पूर्व-मौजूदा भाषा को मॉर्फ करने की कोशिश न करें, क्योंकि यह काम नहीं करेगा क्योंकि सी ++ सी ++ है। [क्या मैं एक अच्छी किताब सुझा सकता हूं?] (Http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – GManNickG
एक संदर्भ जावा के करीब नहीं है। जावा के लिए केवल निकटतम भाषा एक सूचक को वापस करने के लिए होगी। लेकिन यह स्मृति प्रबंधन के लिए जिम्मेदार नहीं है। तो जावा के निकटतम सी ++ निर्माण एक साझा सूचक को वापस करना होगा। std :: tr1 :: shared_ptr (या std :: shared_ptr या boost :: shared_ptr (आप किस संस्करण का उपयोग कर रहे हैं इसके आधार पर))। आप नए और अपने दिल की सामग्री को भूल सकते हैं और आम तौर पर ऑब्जेक्ट कचरा सही ढंग से एकत्र किया जाएगा। लेकिन सी ++ जावा नहीं है। आपको मूल्यों का सही तरीके से उपयोग करने का तरीका सीखना होगा। सी ++ में जावा अवधारणाएं न लाएं भाषाएं अलग-अलग हैं। –
@Gman - ठीक है तो सी ++ जावा नहीं है, लेकिन भाषा विनिर्देशों को अनदेखा कर रहा है। जावा में व्यक्त किए गए विचारों का अनुवाद सी ++ में किया जा सकता है। मैं अक्सर कई भाषाओं में प्रोग्राम करता हूं, अक्सर वाक्यविन्यास अलग होता है लेकिन अर्थशास्त्र नहीं। – brumScouse