我有自己的智能指针类实现。
template<typename Pointee>
class SmartPtr {
private:
Pointee* _pointee;
SmartPtr(SmartPtr &);
public:
explicit SmartPtr(Pointee * pt = 0);
~SmartPtr();
SmartPtr& operator=(SmartPtr&);
operator Pointee*() const { return *_pointee; }
bool operator!() const { return _pointee != 0; }
bool defined() const { return _pointee != 0; }
Pointee* operator->() const { return _pointee; }
Pointee& operator*() const { return *_pointee; }
Pointee* get() const { return _pointee; }
Pointee* release();
void reset(Pointee * pt = 0);
};
template<typename Pointee>
SmartPtr<Pointee>::SmartPtr(SmartPtr &spt) :_pointee(spt.release()) {
return;
}
template<typename Pointee>
SmartPtr<Pointee>::SmartPtr(Pointee * pt) : _pointee(pt) {
return;
}
template<typename Pointee>
SmartPtr<Pointee>::~SmartPtr() {
delete _pointee;
}
template<typename Pointee>
SmartPtr<Pointee>& SmartPtr<Pointee>::operator=(SmartPtr &source)
{
if (&source != this)
reset(source.release());
return *this;
}
template<typename Pointee>
Pointee * SmartPtr<Pointee>::release() {
Pointee* oldSmartPtr = _pointee;
_pointee = 0;
return oldSmartPtr;
}
template<typename Pointee>
void SmartPtr<Pointee>::reset(Pointee * pt) {
if (_pointee != pt)
{
delete _pointee;
_pointee = pt;
}
return;
}
在main.cpp中,我可以这样做:
SmartPtr<Time> sp1(new Time(0, 0, 1));
cout << sp1->hours() << endl;
时间 这是我自己的测试课程。它有方法 hours(),它在我在构造函数中设置的控制台计数中显示。
但是当我想要嵌套智能指针时,我需要这样做:
SmartPtr<SmartPtr<Time>> sp2(new SmartPtr<Time>(new Time(0,0,1)));
cout << sp2->operator->()->hours() << endl;
如何在不使用 operator-&gt;()的情况下执行嵌套智能指针?就像这样:
SmartPtr<SmartPtr<Time>> sp2(new SmartPtr<Time>(new Time(0,0,1)));
cout << sp2->hours() << endl;
它不仅可以嵌套级别2,还可以是任何例如:
SmartPtr<SmartPtr<SmartPtr<Time>>> sp3(new SmartPtr<SmartPtr<Time>>(new SmartPtr<Time>(new Time(0, 0, 1))));
我们应该使用:
cout << sp3->hours() << endl;
而不是:
cout << sp3->operator->()->operator->()->hours() << endl;
答案 0 :(得分:0)
您不能使用operator->
一次覆盖多个图层,除非您专门Pointee
识别SmartPtr
类型,因此operator->
可以递归编写。
否则,只需使用operator*
清除所有嵌套operator->()
来电:
cout << (*(*(*sp3))).hours() << endl;
或者
cout << (*(*sp3))->hours() << endl;