- >智能指针中的用法

时间:2013-11-14 20:13:00

标签: c++ pointers smart-pointers dereference

我有一个简单的智能指针实现,如下面的代码片段1所示。在第二个片段中有一个名为Dummy的虚拟测试类。代码片段3显示了我们如何利用这个简单的智能指针来访问函数foo()。

我的问题是关于我们使用 - >调用Dummy类中的函数foo()的方式。运营商。 - > operator已经返回指向原始指针的指针。所以,我想,为了让我们能够调用函数foo(),我们需要执行第二个 - >对返回的原始指针的操作。但是,很多资源都说单次使用 - >操作员就足够了。

简而言之,我认为正确的电话应该如下: (dummy->) - > FOO();

但是,像dummy-> foo()这样的调用工作正常。有人可以解释我为什么(dummy->) - > foo()不正确?也许,我有一个概念上的误解,但我想知道这个概念是正确的。

CODE SNIPPET 1(SMART POINTER Class)

template <typename T>
class SmartPointer
{
 private:
    T* mRawPointer;

 public:
    SmartPointer(T* thePointer) : mRawPointer(thePointer) {}
    ~SmartPointer() { delete mRawPointer;}

    T& operator* () const { return *mRawPointer; }

    T* operator-> () const { return mRawPointer; }

};

代码SNIPPET 2(类假人)

class Dummy
{
 public:
   foo() {......}
};

CODE SNIPPET 3(问题中的调查替代方案)

SmartPointer<Dummy> dummy(new Dummy());

(dummy->)->func(); 
//I think the above is correct cause we need to make a second dereference on the 
//returned raw pointer
//OR
dummy->func();

2 个答案:

答案 0 :(得分:3)

它是这样的,因为标准是这样说的......

  

表达式x-> m被解释为(x.operator-&gt;()) - &gt; m表示类   如果T :: operator-&gt;()存在且操作符是,则类型为T的对象x   通过重载决策选择最佳匹配函数   机制

答案 1 :(得分:1)

这样想:

dummy->实际上会返回Dummy*。该标准允许在重载operator-&gt;()时,单个箭头足以推断1)重载运算符和2)底层原始指针。

如果没有这种机制,我们就无法真正拥有“智能”指针,因为它与原始指针之间的语法会有所不同。