嵌套智能指针操作符 - >

时间:2017-10-07 13:54:27

标签: c++ pointers nested operator-keyword

我有自己的智能指针类实现。

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;

1 个答案:

答案 0 :(得分:0)

您不能使用operator->一次覆盖多个图层,除非您专门Pointee识别SmartPtr类型,因此operator->可以递归编写。

否则,只需使用operator*清除所有嵌套operator->()来电:

cout << (*(*(*sp3))).hours() << endl;

或者

cout << (*(*sp3))->hours() << endl;