【发布时间】:2011-08-14 14:01:51
【问题描述】:
我已经创建了一个智能指针实现,如下所示::
#include <iostream>
#include <vector>
using namespace std;
class Obj {
int i, j;
public:
Obj() { i = 0 ; j = 0 ; }
Obj(int ii , int jj) : i(ii) , j(jj) { }
void f() { cout << i << endl; }
void g() { cout << j << endl; }
};
class ObjDerived : public Obj
{
int k;
public:
ObjDerived(int kk = 0) :k(kk) { }
void h() { cout << k << endl; }
};
template <typename ULT >
class SP
{
ULT* ptr;
public:
explicit SP(ULT* tptr = NULL) : ptr(tptr) { }
template <typename OTHER>
SP(SP<OTHER>& other)
{
ptr = (ULT*)other.ptr;
}
ULT* operator->() { return ptr; }
ULT& operator*() { return *ptr; }
SP<ULT>& operator=(SP<ULT>& tptr)
{
if(ptr != tptr.ptr)
ptr = tptr.ptr;
return *this;
}
SP<ULT>& operator=(ULT* tptr)
{
ptr = tptr;
return *this;
}
template <typename OTHER>
SP<ULT>& operator=(SP<OTHER>& der) // ??
{
cout << "In operator\n";
this->ptr = (ULT*)der.ptr;
return *this;
}
~SP()
{
if(ptr != NULL )
delete ptr;
}
};
int main()
{
SP<Obj> Sptr2(new Obj(10,20));
SP<ObjDerived> Sptr4(new ObjDerived(80));
Sptr2 = Sptr4; //error in this line
return 0;
}
我正在尝试使用智能指针 SP 将派生类指针转换为基类指针。 operator= 成员函数
template <typename OTHER>
SP<ULT>& operator=(SP<OTHER>& der) // ??
{
cout << "In operator\n";
this->ptr = (ULT*)der.ptr;
return *this;
}
出现以下错误 ---> 错误:'ObjDerived* SP::ptr' 是私有的
我不知道如何使用智能指针实现所需的指针转换。我还搜索了以前有关智能指针的帖子,但找不到我的问题的确切答案。
【问题讨论】:
-
您的复制和赋值行为是错误的——这将导致旧对象泄漏并删除新对象两次。此外,C 风格的强制转换会默默地允许无效的指针转换,这可能会导致通过不兼容的指针类型错误地删除对象。
-
“我已经创建了一个智能指针实现”。为什么?
-
@Johnsyweb:作为一种学习练习,这是一件好事。最重要的教训是,要做到正确非常困难。
-
@Mike:完全同意。不幸的是,有些人将这些练习包含在生产代码中。
标签: c++