社区
C++ 语言
帖子详情
智能指针中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
打赏
收藏
智能指针中operator &的一个问题
我在看COM技术内幕中智能指针的实现部分时有个地方没有看明白, T** operator&() { assert(m_PI == NULL ); return &m_PI; } 为什么要断言m_PI== NULL呢? 还有一个地方,在对赋值操作的重载中 T* operator=( T* pI ) { ... IUnknown *pOld = m_PI; //为什么不直接定义为T* pOld呢,这样做有什么好处吗 ... }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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了.
C++11:
智能指针
智能指针
:是指用于存储和封装指针的类,被存储的指针指向了从堆上动态分配的对象,能够在适当的时间自动删除指向的对象。
智能指针
在面对异常的时候能确保...实现
一个
最简单的
智能指针
: template<typename T..
C++
智能指针
详解
用
智能指针
便可以有效缓解这类
问题
,本文主要讲解参见的
智能指针
的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_pt
operator
* 和
operator
-> 操作符的重载在自定义
智能指针
class MyPtr
中
的应用
operator
* 和
operator
-> 操作符的重载在自定义
智能指针
class MyPtr
中
的应用
智能指针
(二)
智能指针
的几个
问题
智能指针
是
一个
类模板 经过实例化后,
智能指针
就和普通类没有什么区别。 构造函数 默认构造shared_ptr<T> sp和unique_ptr<T> up 指针构造shared_ptr<T> sp(T *)和unique_ptr<T> up(T *),...
C++新特性17_
智能指针
的原理(
智能指针
引子;指出什么是
智能指针
;为使利用类构造析构管理资源释放更像指针,对运算符进行重载,但会因重复析构造成崩溃,提出禁止和拷贝移动方法,均有缺陷;推荐新指针方法)
在没有
智能指针
之前,我们都是采用手动释放的方法。 #include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; //
智能指针
//1.用起来像...
C++ 语言
64,646
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章