यह असंभव हो सकता है, लेकिन मैं सोच रहा था कि क्या इसकी मूल अभिव्यक्ति के पीछे कभी भी अस्थायी रखना संभव था। मैं जिन वस्तुओं पर माता पिता वस्तुओं को इंगित की एक श्रृंखला है, और एक सदस्य समारोह जो एक बच्चे वस्तु पैदा करेगा, एक सरल उदाहरण यहाँ हैअपने जीवनकाल को विस्तारित करने से अस्थायी रोकें?
class person{
string name;
person * mommy;
public:
person(const string & nam, person * m = 0) : name(nam), mommy(m) {}
person baby(const string & nam){
return person(nam, this);
}
void talk() const{
if (mommy) mommy->talk();
cout << name << endl;
}
};
int main(){
person("Ann").baby("Susan").baby("Wendy").talk(); // fine
const person & babygirl = person("Julie").baby("Laura"); // not fine
babygirl.talk(); // segfault
return 0;
}
तरह से मैं का उपयोग करने के person
एक समारोह के लिए इसे पारित करने के लिए है चाहता हूँ, और इस तरह कुछ:
void use(const person & p) {
p.talk();
}
use(person("Anna").baby("Lisa"));
ठीक है।
यह तब तक ठीक काम करेगा जब तक कि कोई भी अस्थायी मूल अभिव्यक्ति से पहले जीवित रहे, लेकिन यदि मैं अंतिम अस्थायी में से किसी एक को संदर्भ में संदर्भित करता हूं, तो उसके माता-पिता जीवित नहीं रहते हैं, और मुझे एक सीगफॉल्ट मिलता है। मैं person
की कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर छुपा सकता हूं, लेकिन क्या इस तरह की त्रुटि को रोकने से मैं किसी भी तरह से रोक सकता हूं? यदि संभव हो तो मैं गतिशील आवंटन से बचना चाहता हूं।
@ कोनराड: आईरिकॉन; -] – ildjarn
ध्यान दें कि यह कोड उसी तरह से "ठीक नहीं है" कि 'const int और i = std :: वेक्टर (1) [0]; 'लिखा नहीं है" ठीक है "। 'वेक्टर' आपको लिखने से नहीं रोकता है, और इसकी आवश्यकता नहीं है। यहां कुंजी यह है कि माँ को नष्ट करने से बच्चे को अनुपयोगी लगता है, बच्चा माँ का हिस्सा है। डिजाइन के साथ यही गलत है, यह प्रतिद्वंद्वी है। आप अनाथ के रूप में ऐसी कोई चीज़ होने से रोकने के लिए इसे पकड़ने की कोशिश कर रहे हैं, जो उचित हो सकता है लेकिन आपको यह भी विचार करना चाहिए कि अनाथों को बेहतर परिभाषित व्यवहार होना चाहिए या नहीं, या अधिक स्पष्ट रूप से बनाने के लिए एक बुरी चीज होनी चाहिए। –
स्टीव के साथ सहमत: यह सिर्फ खराब डिजाइन दिखा रहा है।एक नग्न सूचक की उपस्थिति को दूर देना चाहिए था कि कुछ बंद है। –