C++ -&燃气轮机;智能指针的用法
我有一个简单的智能指针实现,如下面的代码片段1所示。在第二个代码段中,还有一个名为dummy的虚拟测试类。代码片段3展示了如何利用这个简单的智能指针访问函数foo() 我的问题是关于在类Dummy中使用->运算符调用函数foo()的方式。->运算符已返回指向原始指针的指针。因此,我认为,为了能够调用函数foo(),我们需要对返回的原始指针执行第二个->操作。然而,许多参考资料都说,只需使用->操作符就足够了 简而言之,我认为正确的呼叫应该如下所示: (虚拟->)->foo() 但是,类似于dummy->foo()的调用可以正常工作。有人能解释一下为什么(dummy->)->foo()不正确吗?也许,我有一个概念上的误解,但我想知道的概念是正确的 代码片段1(智能指针类) 代码片段3(有问题的发票替代方案)C++ -&燃气轮机;智能指针的用法,c++,pointers,smart-pointers,dereference,C++,Pointers,Smart Pointers,Dereference,我有一个简单的智能指针实现,如下面的代码片段1所示。在第二个代码段中,还有一个名为dummy的虚拟测试类。代码片段3展示了如何利用这个简单的智能指针访问函数foo() 我的问题是关于在类Dummy中使用->运算符调用函数foo()的方式。->运算符已返回指向原始指针的指针。因此,我认为,为了能够调用函数foo(),我们需要对返回的原始指针执行第二个->操作。然而,许多参考资料都说,只需使用->操作符就足够了 简而言之,我认为正确的呼叫应该如下所示: (虚拟->)->foo() 但是,类似于dum
SmartPointer虚拟对象(新虚拟对象());
(虚拟->)->func();
//我认为以上是正确的,因为我们需要对
//返回的原始指针
//或
dummy->func();
这是因为标准上这么说
对于类,表达式x->m被解释为(x.operator->())->m
如果存在T::运算符->(),并且运算符为
通过重载分辨率选择为最佳匹配函数
机制
这是因为标准上这么说 对于类,表达式x->m被解释为(x.operator->())->m 如果存在T::运算符->(),并且运算符为 通过重载分辨率选择为最佳匹配函数 机制 这样想:
dummy->
实际上返回dummy*
。该标准允许在重载运算符->()时,一个箭头就足以推断1)重载运算符和2)底层原始指针
如果没有这种机制,我们就不可能真正拥有“智能”指针,因为它与原始指针之间的语法会有所不同。这样想:
dummy->
实际上返回dummy*
。该标准允许在重载运算符->()时,一个箭头就足以推断1)重载运算符和2)底层原始指针
如果没有这种机制,我们就不可能真正拥有“智能”指针,因为它和原始指针之间的语法是不同的。注意
a->b
被定义为(*a)。b
(对于非重载的->
),因此(dummy->)func()
将被定义为(*((*dummy)。.func()这是无意义的。注意a->b
被定义为(*a)。b
(对于非重载的->
),因此(dummy->)->func()
将被定义为(*dummy)。.func()
,这是无意义的。
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; }
};
class Dummy
{
public:
foo() {......}
};
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();