首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

这是指针还是对象?求真相!该怎么解决

2012-04-08 
这是指针还是对象?求真相!!做过ADO编程的师兄师姐们肯定写过这样的代码:_RecordsetPtr m_pRecordset[colo

这是指针还是对象?求真相!!
做过ADO编程的师兄师姐们肯定写过这样的代码:
_RecordsetPtr m_pRecordset;
[color=#FF0000]m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(...);[/color] //这里省略参数
注意看看上面的两条语句,[color=#FF0000]他们调用函数的方式不一样[/color]:一个是 "." 方式,一个是 "->" 方式
经过查阅资料发现 _RecordsetPtr的最初类型是 _com_ptr_t<Recordset> ,貌似就是com智能指针。
好,既然是指针,那么为什么调用 CreateInstance 方法还要用 "." 方式呢?
又进一步的了解到:所有的 _com_ptr_t 类的成员函数都是通过 "." 方式调用;
而所有的模板参数类的成员函数都是通过 "->" 调用。

希望前辈们在原理上做个解释!这是什么样的规则。
m_pRecordset是指针呢,还是对象?


[解决办法]
_com_ptr_t是智能指针模板类,_com_ptr_t<Recordset>是实例化的一个类,既然是一个类,定义的
m_pRecordset是一个对象,那么利用.调用就很正常了;至于利用->调用,应该是_com_ptr_t重载了->操作符。内部实现大概如下:

C/C++ code
_Ty *operator->() const _THROW0()        {    // return pointer to class object #if _ITERATOR_DEBUG_LEVEL == 2        if (_Myptr == 0)            _DEBUG_ERROR("auto_ptr not dereferencable"); #endif /* _ITERATOR_DEBUG_LEVEL == 2 */        return (get());        }
[解决办法]
LZ被智能指针的“指针”搞混了
智能指针是一种管理对象指针的技术,而不是说m_pRecordset是一个指针
如_RecordsetPtr,其中有一个成员是_Recordset*对象指针
运算符"->"重载,是调用_Recordset对应的成员函数
m_pRecordset是对象,CreateInstance用运算符".",进行_Recordset*实例化

热点排行