मैंने इंटरनेट पर देखा है और यह थ्रेड इस स्थिति का पूरा उत्तर ढूंढ रहा है। मैंने पढ़ा है कि वस्तुओं को स्मार्ट पॉइंटर्स फेंकना बहुत चालाक नहीं है। मैं सिर्फ यह समझना चाहता हूं कि ऐसा क्यों हो रहा है। मैं स्थिति की व्याख्या करूंगा। चलो इस सरल पदानुक्रम की कल्पना करते हैं:स्मार्ट प्वाइंटर्स और अपवाद हैंडलिंग
class Foo
{
public: virtual ~Foo() {}
};
typedef tr1::shared_ptr<Foo> SPFoo;
class FooInherited: public Foo { };
typedef tr1::shared_ptr<FooInherited> SPFooInherited;
और के इस परीक्षण कोड की जांच करते हैं:
int main(int argc, char** argv)
{
try
{
throw FooInherited();
}
catch(const Foo& f)
{
cout << "Foo& caught!" << endl;
}
try
{
throw SPFooInherited(new FooInherited());
}
catch(const SPFoo& f)
{
cout << "SPFoo& caught!" << endl;
}
return 0;
}
सब कुछ संकलित लेकिन क्रम में दूसरा कोशिश पकड़ निष्पादित नहीं किया जाएगा। क्या कोई मुझे समझा सकता है क्यों? विशेष रूप से यदि जैसे कोड की रेखाएं रनटाइम में यह काम बिल्कुल ठीक है।
void function(const SPFoo& f)
{
}
...
SPFooInherited fi(new FooInherited());
function(fi);
मुझे समझ नहीं समस्या यह है कि SPFooInherited SPFoo (भले ही FooInherited फू से विरासत) से विरासत नहीं है, लेकिन यह गहराई से पता करने के लिए संकलक/क्या चाहते हैं आरटीई समारोह कॉल उदाहरण से अलग ढंग से कर रही है अपवाद को पकड़ते समय स्थिति को हल करने में सक्षम नहीं होना चाहिए। क्या ऐसा इसलिए है क्योंकि कैच पैरामीटर फ़ंक्शन कॉल पैरामीटर के समान नहीं है? क्यों Foo & काम करता है और एसपीएफयू नहीं करता है?
अग्रिम में बहुत बहुत धन्यवाद।
सम्मान, आईकर।