लंबे शीर्षक के लिए खेद है, लेकिन मैं विशिष्ट होना चाहता था। मैं काम करने के लिए निम्न कोड की उम्मीद है, लेकिन यह नहीं है और मैं समझ नहीं करता है क्यों:/किसी व्युत्पन्न वर्ग के लिए पॉइंटर को बेस क्लास के पॉइंटर के संदर्भ की अपेक्षा करने वाले फ़ंक्शन को कैसे पास नहीं किया जा सकता है?
#include <cstdio>
#include <cassert>
class UniquePointer
{
public:
void Dispose()
{
delete this;
}
friend void SafeDispose(UniquePointer*& p)
{
if (p != NULL)
{
p->Dispose();
p = NULL;
}
}
protected:
UniquePointer() { }
UniquePointer(const UniquePointer&) { }
virtual ~UniquePointer() { }
};
class Building : public UniquePointer
{
public:
Building()
: mType(0)
{}
void SetBuildingType(int type) { mType = type; }
int GetBuildingType() const { return mType; }
protected:
virtual ~Building() { }
int mType;
};
void Foo()
{
Building* b = new Building();
b->SetBuildingType(5);
int a = b->GetBuildingType();
SafeDispose(b); // error C2664: 'SafeDispose' : cannot convert parameter 1 from 'Building *' to 'UniquePointer *&'
b->Dispose();
}
int main(int argc, char* argv[])
{
Foo();
return 0;
}
ध्यान दें कि आप जो भी करने की कोशिश कर रहे हैं उसके बारे में "सुरक्षित" कुछ भी नहीं है। यदि 'बी'' NULL' पर सेट किया गया है तो 'b-> निपटान(); 'व्यवहार का कारण बनता है जो कि अनिर्धारित है जैसे' b' किसी हटाए गए ऑब्जेक्ट को इंगित करता है। –
@ चार्ल्स: संपादित, समीक्षा के लिए प्रतीक्षा कर रहा है। यह बग एक प्रश्न का हिस्सा नहीं है, है ना? –
इसके अलावा, 'निपटान' के बाद से एक मित्र होने के लिए 'सुरक्षित डिस्प्ले' की आवश्यकता नहीं है। –