智能指针中operator &的一个问题

haozi112 2006-03-28 04:57:57
我在看COM技术内幕中智能指针的实现部分时有个地方没有看明白,
T** operator&()
{
assert(m_PI == NULL );
return &m_PI;
}
为什么要断言m_PI== NULL呢?
还有一个地方,在对赋值操作的重载中
T* operator=( T* pI )
{
...
IUnknown *pOld = m_PI; //为什么不直接定义为T* pOld呢,这样做有什么好处吗

...
}
...全文
149 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luvybird 2006-03-29
  • 打赏
  • 举报
回复
学习
haozi112 2006-03-28
  • 打赏
  • 举报
回复
ugg(逸学堂(exuetang.net)) 说的很好,我承认,但是那不是我需要的东西,不好意思啊,ugg(逸学堂(exuetang.net)) ,就事论事。你们前面说的我都明白,但healer_kx(天降甘草的甘草)贴的这段代码让我一下子转过湾来了:if (SUCCEEDED(CoCreateInstance(
CLSID_KXDBCore, NULL, CLSCTX_INPROC_SERVER, IID_IKXDBCore, (void**)&m_pDBCore))).我一直都脱离了COM的范围在考虑代码的用意,你点醒了我
healer_kx 2006-03-28
  • 打赏
  • 举报
回复
ugg(逸学堂(exuetang.net)) 他说得很好了~~~真的哦~~~~~~~~.

第二个问题,你想啊.=号重载要做的就是改变引用计数~,要T干吗>? IUnkown*就足够了.
haozi112 2006-03-28
  • 打赏
  • 举报
回复
现在等着第二个问题了,看看别人都怎么分析的,呵呵,healer_kx(天降甘草的甘草) ,给你80分,够意思吧
haozi112 2006-03-28
  • 打赏
  • 举报
回复
哦,明白了,想通了,谢谢healer_kx,我一直到在考虑对m_PI取地址的用意 ,如果说m_PI不等于NULL的时候,对其取地址就就会出现错误,我没有明白的地方就在这里了。这样以来的话一定要保证m_PI是NULL的,而COM要求不能对一个接口指针重复赋值的。也就保证了&运算在接口没有被释放之前不能在Create,现在相通了,谢谢
healer_kx 2006-03-28
  • 打赏
  • 举报
回复
兄弟,你先理清思绪,看看T*和T**的区别.
再给你一段代码,看看它的使用状况.

if (SUCCEEDED(CoCreateInstance(
CLSID_KXDBCore, NULL, CLSCTX_INPROC_SERVER, IID_IKXDBCore, (void**)&m_pDBCore)))

haozi112 2006-03-28
  • 打赏
  • 举报
回复
但是问题是assert( m_PI == NULL ),然后取地址啊,也就是说在这个函数里面,就认为m_PI应该是NULL的,按你们的说法,应该是 assert( m_PI != NULL )啊
healer_kx 2006-03-28
  • 打赏
  • 举报
回复
So Cool
并且从C++观念来看,一个引用
是不需要判断其是否有效的,因为是空引用在C++中不存在
逸学堂 2006-03-28
  • 打赏
  • 举报
回复
T** operator&()
{
assert(m_PI == NULL );
return &m_PI;
}
为什么要断言m_PI== NULL呢?

~~~~~~
CComptr ptr;
com智能指针允许上面那样定义,而这时会调用默认构造函数将m_PI设置为NULL。
所以对一个null指针,取其地址是没有意义的。并且从C++观念来看,一个引用
是不需要判断其是否有效的,因为是空引用在C++中不存在。所以,这时assert(m_PI)
是否为空,再来返回其引用。

还有一个地方,在对赋值操作的重载中
T* operator=( T* pI )
{
...
IUnknown *pOld = m_PI; //为什么不直接定义为T* pOld呢,这样做有什么好处吗
~~~


}
healer_kx 2006-03-28
  • 打赏
  • 举报
回复
就第二个问题再说几句,(虽然我不是10分确定),
IUnknown* p,
即使写成了T* p,也是会转化为 (IUnknown*)p的.毕竟它要做的事情就是AddRef和Release.
有IUnknown就可以了.
healer_kx 2006-03-28
  • 打赏
  • 举报
回复
第二个问题,我觉得都是可以的.
healer_kx 2006-03-28
  • 打赏
  • 举报
回复
首先,第一个问题,你要知道智能指针怎么用吧,你想想它的用法?当然要为NULL了.

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧