我创建了一个智能指针实现,如下所示::
#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;
}
给出以下错误---&gt;错误:'ObjDerived * SP :: ptr'是私有的
我无法找到如何使用智能指针实现所需的指针转换。我还搜索了以前关于智能指针的帖子,但找不到我问题的确切答案。
答案 0 :(得分:0)
成员ptr是私有的 - 将其公开或提供公共访问方法。
答案 1 :(得分:0)
您是否考虑过使用Boost smart pointers而不是尝试自己动手?他们已经经历了实现优秀智能指针类的所有痛苦。即使由于某种原因你不能使用Boost,你仍然可以从他们的课程中学到很多东西。
答案 2 :(得分:0)
您可以提供公共get()函数成员以便能够检索原始指针。通常智能指针提供此功能。小例子:
template <typename ULT >
class SP {
// ...
ULT* get() const {return ptr;}
template <typename OTHER>
SP<ULT>& operator=(SP<OTHER>& der) {
cout << "In operator\n";
this->ptr = (ULT*)der.get();
return *this;
}
};
您还可以查看Effective C++的第45项,了解有关创建智能指针的更多信息。
我假设您正在为训练任务执行此操作,因为有非常好的智能指针实现,例如boost::shared_ptr
。
答案 3 :(得分:0)
您可以将成员ptr
设为私有。或者您可以使用内置复制机制:
而不是,
this->ptr = (ULT*)der.ptr; // ptr needs to be accessible
请执行以下操作:
*this = *((ULT*&)der); // copy using in-built shallow copy