मुझे संदर्भ समझने में समय का शैतान है। निम्नलिखित कोड पर विचार करें:सीखना सी ++: रिटर्निंग संदर्भ और स्लाइसिंग के आसपास हो रही है
class Animal
{
public:
virtual void makeSound() {cout << "rawr" << endl;}
};
class Dog : public Animal
{
public:
virtual void makeSound() {cout << "bark" << endl;}
};
Animal* pFunc()
{
return new Dog();
}
Animal& rFunc()
{
return *(new Dog());
}
Animal vFunc()
{
return Dog();
}
int main()
{
Animal* p = pFunc();
p->makeSound();
Animal& r1 = rFunc();
r1.makeSound();
Animal r2 = rFunc();
r2.makeSound();
Animal v = vFunc();
v.makeSound();
}
और परिणाम हैं: "छाल छाल कच्चे कच्चे"।
सोचने के जावा तरीके में, (जिसने सी ++ की मेरी अवधारणा को स्पष्ट रूप से दूषित कर दिया है), परिणाम "छाल छाल छाल छाल" होंगे। मैं अपने previous question से समझता हूं कि यह अंतर स्लाइसिंग के कारण है और अब मुझे स्लाइसिंग की अच्छी समझ है।
लेकिन मान लें कि मुझे ऐसा फ़ंक्शन चाहिए जो एक पशु मूल्य देता है जो वास्तव में एक कुत्ता है।
- क्या मैं सही ढंग से समझता हूं कि मुझे जो निकटतम मिल सकता है वह संदर्भ है?
- इसके अलावा, क्या यह आरएफएनसी इंटरफ़ेस का उपयोग करके उस पर निर्भर है कि यह संदर्भ देखने के लिए एक पशु & असाइन किया गया है? (या अन्यथा जानबूझकर एक पशु के संदर्भ को असाइन करें, जो स्लाइसिंग के माध्यम से, पॉलिमॉर्फिज्म को छोड़ देता है।)
- पृथ्वी पर कैसे मैं एक नई जेनरेट की गई वस्तु के संदर्भ को आरएफएनसी में उपरोक्त बेवकूफ चीज़ के बिना संदर्भ वापस कर रहा हूं? (कम से कम मैंने सुना है इस बेवकूफ है।)
अद्यतन: हर किसी को अब तक इस बात से सहमत करने लगता है के बाद से है कि rFunc यह नाजायज, कि एक और संबंधित प्रश्नों को लाता है:
अगर मैं वापस पारित एक सूचक मैं प्रोग्रामर से कैसे संवाद कर सकता हूं कि अगर यह मामला है तो पॉइंटर को हटाना नहीं है? या वैकल्पिक रूप से मैं कैसे संवाद कर सकता हूं कि पॉइंटर किसी भी समय (उसी धागे से लेकिन एक अलग फ़ंक्शन से) हटाने के अधीन है ताकि कॉलिंग फ़ंक्शन इसे स्टोर न करे, अगर ऐसा होता है। टिप्पणियों के माध्यम से संवाद करने का एकमात्र तरीका है? वह मैला लगता है।
नोट: यह सब एक टेम्पलेटेड shared_pimpl अवधारणा के लिए एक विचार के लिए अग्रणी है जिस पर मैं काम कर रहा था। उम्मीद है कि मैं इसके बारे में कुछ दिनों में कुछ पोस्ट करने के लिए पर्याप्त सीखूंगा।
जावा संदर्भ सी ++ पॉइंटर्स की तरह अधिक हैं। जावा में सी ++ संदर्भों की तरह कुछ भी नहीं है। –
कृपया प्रभावी सी ++ पढ़ें। –
@ एलेक्स का सुझाव एक अच्छा है। स्कॉट मेयर्स द्वारा "प्रभावी सी ++" और "अधिक प्रभावी सी ++", उत्कृष्ट किताबें हैं और विशेष रूप से आपके जैसे कठिन मुद्दों के साथ सी ++ की मेरी समझ में मदद मिली है। बेशक, मैं इसे अब से भूल गया हूं क्योंकि मैंने कुछ वर्षों तक गंभीर सी ++ नहीं किया है :( –