मैं एक स्मार्ट व्यायामकर्ताओं के लिए अभ्यास के रूप में कोड लिख रहा हूं। ऑनलाइन ट्यूटोरियल का उपयोग करना (1, 2) मैंने संदर्भ गणना के साथ एक सामान्य स्मार्ट-पॉइंटर वर्ग विकसित किया है। ,गैर वर्चुअल विनाशकों के लिए ऑब्जेक्ट स्लाइसिंग से बचें
जब स्मार्ट सूचक पता लगाता है कि कोई और अधिक संदर्भ एक विशेष वस्तु के लिए मौजूद हैं, यह वस्तु एक सूचक के माध्यम से मूल प्रकार को हटाना होगा, भले ही: समस्या मैं निम्नलिखित यह पता लगाने में असमर्थ हूँ है अंतिम स्मार्ट पॉइंटर का टेम्पलेट तर्क मूल प्रकार का है। यह गैर-वर्चुअल विनाशकों के लिए ऑब्जेक्ट स्लाइसिंग से बचने के लिए है।
मैं इसे कैसे प्राप्त कर सकता हूं। असल में मेरा कोड नीचे जैसा दिखता है (ट्यूटोरियल से)।
template < typename T > class SP
{
private:
T* pData; // pointer
RC* reference; // Reference count
public:
SP() : pData(0), reference(0)
{
// Create a new reference
reference = new RC();
// Increment the reference count
reference->AddRef();
}
SP(T* pValue) : pData(pValue), reference(0)
{
// Create a new reference
reference = new RC();
// Increment the reference count
reference->AddRef();
}
SP(const SP<T>& sp) : pData(sp.pData), reference(sp.reference)
{
// Copy constructor
// Copy the data and reference pointer
// and increment the reference count
reference->AddRef();
}
~SP()
{
// Destructor
// Decrement the reference count
// if reference become zero delete the data
if(reference->Release() == 0)
{
delete pData;
delete reference;
}
}
T& operator*()
{
return *pData;
}
T* operator->()
{
return pData;
}
SP<T>& operator = (const SP<T>& sp)
{
// Assignment operator
if (this != &sp) // Avoid self assignment
{
// Decrement the old reference count
// if reference become zero delete the old data
if(reference->Release() == 0)
{
delete pData;
delete reference;
}
// Copy the data and reference pointer
// and increment the reference count
pData = sp.pData;
reference = sp.reference;
reference->AddRef();
}
return *this;
}
};
संपादित करें:
प्राप्त करने के लिए मैं मूल प्रकार के लिए सूचक है करने के लिए है।
मैं एक सवाल यहाँ पोस्ट किया है: delete via a pointer to Derived, not Base
लेकिन अब टिप्पणियों और जवाब को देखने के बाद मुझे लगता है कि दोनों से संबंधित हैं।
template <typename T>
template <typename U>
Sptr<T>::Sptr(U* u) : obj(u),ref(NULL) {
//do something
ref = new RC();
ref->AddRef();
}
अब Sptr<Base1> sp(new Derived);
जहां Derived
Base1
से ली गई है पर विचार: मैं निर्माता की है। बेस 1 ने कन्स्ट्रक्टर/विनाशक की रक्षा की है। जो T
के किसी ऑब्जेक्ट के लिए संग्रहीत है, लेकिन मुझे इसे टाइप यू के ऑब्जेक्ट के माध्यम से स्टोर करने की आवश्यकता है। मुझे इसे संरक्षित करने की आवश्यकता है। मैं उसे कैसे कर सकता हूँ?
यदि किसी बेस क्लास में वर्चुअल विनाशक नहीं है, और कोई उस बेस क्लास के पॉइंटर के माध्यम से व्युत्पन्न क्लास को हटाने का प्रयास कर रहा है, तो कोई इसे गलत कर रहा है। – Chad
इसे प्राप्त करने के लिए, आपको 'एसपी' एक टेम्पलेट कन्स्ट्रक्टर 'एसपी :: एसपी (यू * यू) {...} 'देना होगा और किसी भी तरह मूल प्रकार' यू' (जिसे' टी') बाद में 'यू' के विनाशक को कॉल करने में सक्षम होने के लिए। –
Angew
क्या सी ++ 11 राज्य है कि एक अनुपालन स्मार्ट सूचक यह करना चाहिए? ऐसा प्रतीत होता है कि 'std :: unique_ptr' नहीं है: http://ideone.com/iyanmY – Chad