这是指针还是对象?求真相!!
做过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重载了->操作符。内部实现大概如下:
_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*实例化