找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8317|回复: 61

[求助]:参数表中*&的确切含义是什么?如何用?

[复制链接]
发表于 2003-2-27 10:35:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
搜索ARX2002\Samples\下可找出60多处参数定义或调用使用了 *&修饰符,如:
partopen.cpp:
if(acdbOpenAcDbObject((AcDbObject*&)pLayer, id, AcDb::kForRead) == Acad::eOk) {...

CurveText.cpp:
Acad::ErrorStatus AdcgCurveText::getTransformedCopy(const AcGeMatrix3d& xform,
    AcDbEntity*&  pEnt) const
{...

当然,联机帮助里也有n多的类似表达,但到底怎么理解它,如何使用?
翻了好多书也没找到,烦请高手指点,先谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-2-27 11:39:03 | 显示全部楼层
对指针变量的引用变量
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-2-27 13:00:16 | 显示全部楼层
谢谢liron!
可惜回答了一半。其使用场合仍有点费解,仍然引用Arx2002例:
partopen.cpp:
AcDbLayerTableRecord* pLayer;  //定义指针
~~~~~~~~~~~~~~~~~~~~
... ...

if (acdbOpenAcDbObject((AcDbObject*&)pLayer, id, AcDb::kForRead) == Acad::eOk) {...
                                    ~~~~~~~~~~
其中AcDbObject是AcDbLayerTableRecord的祖父类。
既然指针传递的已经是地址,如果上述两个类名称相同则不需要这样兜圈子。
---是否仅仅为了对指针指向类型进行强制转换才使用【指针变量的引用】?
    能否给一个适用场合的一般性的描述?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-2-27 23:13:49 | 显示全部楼层
强制转换为父类指针,并作为引用变量传入,指针变量须以引用变量的形式传入,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-2-28 12:12:00 | 显示全部楼层
指针引用。
把 指针看做普通变量来考虑,就比较好理解。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-3-4 08:49:44 | 显示全部楼层
终于明白了,有劳大家。看来我的CPP没过关,先闷头看一个月的书再来学ARX吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-5 00:18:29 | 显示全部楼层
最初由 jzj2000 发布
[B]终于明白了,有劳大家。看来我的CPP没过关,先闷头看一个月的书再来学ARX吧。 [/B]


你明白了吗,你明白对指针的引用了吗, 你知道在 acdbOpenAcDbObject() 中使用*&的原因了吗。给大家说说你的理解

你发起的这个主题是个值得初学者深思的话题
值得加分
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-5 14:46:58 | 显示全部楼层
<p><font color=blue><b><u>本贴已经被斑竹移动到文章中心,加10个爱心币!</u></b><br>文章中心链接:<a href='/artical/show.php?id=2059'>http://www.xdcad.net/artical/show.php?id=2059</a></font></p><br>
  1. <table border=1 cellpadding=0 cellspacing=0 style=border-collapse: collapse bordercolor=#111111 width=650 id=AutoNumber1 height=498><tr><td width=100% height=489><iframe name=I1 width=100% height=100% src=/artical/show.php?id=2059>浏览器不支持嵌入式框架或配置为不显示嵌入式框架</iframe></td></tr></table>
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-6 00:35:13 | 显示全部楼层
最初由 chxmhsd 发布
[B]C++指针使用方法解惑


作者:hangwire


    在下列函数声明中,为什么要同时使用*和&符号?以及什么场合使用这种声明方式?  

      void func1( MYCLASS *&pBuildingElement );      
    论坛中经常有人... [/B]

讲得好,加分

补充几句.
你在文中举了这样一个例子
  1. void func1(MYCLASS *&pMyClass);
  2. {
  3.     pMyClass = new MYCLASS;
  4.     //……
  5. }
复制代码

这段代码没有错,但我要指出,这个函数是个比较糟糕的设计。
如果仅看函数的声明(不看实现部分),能误导函数的使用者忘记 delete MYCLASS, 从而导致Memory Leak。至少我会这样。

与其如此,还不如这样写,
  1. MYCLASS* func1(void);
  2. {
  3.     pMyClass = new MYCLASS;
  4.     //……
  5.     return pMyClass;  
  6. }
复制代码
能比较明确的告诉使用者,这个函数在堆里构造了对象,需要delete. 或者写成
  1. void func1(MYCLASS** pMyClass);
  2. {
  3. *pMyClass = new MYCLASS;
  4. ……
  5. }
复制代码

作为一个不成文的约定,在函数的参数表中使用 *& 通常意味着即将附值给指针的对象已经存在(或者在堆中,或者在调用者的栈中,或者是其它某个地方)。换个说法,在参数表中使用*&,不应强求使用者delete 指针指向的对象.

比较合理的写法是
  1. void func1(MYCLASS *&pMyClass);
  2. {
  3.     pMyClass = pSomeOldMyClass;//pSomeOldMyClass指向的对象已经在内存的某个地方存在
  4.     //……
  5. }
复制代码



我们可以在 acdbOpenAcDbObject() 中应证。
  1. {
  2.     ads_name en;
  3.     ads_point pt;

  4.     if ((acedEntSel("\nSelect an Entity ", en, pt) == RTNORM)
  5.     {
  6.         AcDbObjectId eId;
  7.         if (acdbGetObjectId(eId, en) == Acad::eOk)
  8.         {
  9.             AcDbObject* pObj = NULL;
  10.             if (acdbOpenObject(pObj, eId, AcDb::kForRead) == Acad::eOk)
  11.             {
  12.                 acutPrintf("\nthe AcDbObject Ptr: %p ", pObj);//输出pObj的内存地址
  13.                 pObj-> close();
  14.             }
  15.         }
  16.     }
  17. }
复制代码

只要你每次选中的是同一个 Entity ,  pObj的地址肯定是相同的。因为在Acad的一个编辑会话中(从打开一个Dwg文件到关闭),所有的数据库常驻对象(database-resident Object),是[B]常驻[/B]内存的(即使这个对象没有打开, 但它已经在内存中存在).acdbOpenAcDbObject(AcDbObject*& pObj, AcDbObjectId id, ...)的目的仅仅是改变这个对象的状态,然后让pObj指向这个对象(pObj = pSomeObj  注意:并没有涉及到堆内存的申请)

欢迎继续讨论
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-9 15:03:26 | 显示全部楼层
(pObj = pSomeObj 注意:并没有涉及到堆内存的申请)
但是 我添加了扩展数据呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-29 13:33:45 | 显示全部楼层
太复杂了,幸亏我还没有用到
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-4-17 10:31:00 | 显示全部楼层
如果换一个角度很好理解:
void MainFunc()
{
MyClass* MyObj;
getMyObj(&MyObj);
}
void getMyObj(MyClass **pMyClass)
{
static MyClass obj;
*pMyClass=&obj;
}
即主调函数希望传给子函数一个指针,由子函数对此指针本身赋值,必然主函数要
传给子函数的是一个二级指针,故子函数必须声明为一个二级指针,
这是纯指针解决办法,为从安全考虑,arx使用了指针的引用,不过是二级指针的一个
变通办法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-8 15:40:17 | 显示全部楼层
读书一月,苦干一月。现在用这种东西就象吃白菜了。
为飨来者同好,特总结如下:
1.只要看到&,只需知其作用是不产生副本;否则产生副本,随后的改变将传不回去。
2.去掉&剩下的就是那个原始的变量。
                                    ---就这么简单。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-10 12:36:19 | 显示全部楼层
23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-18 17:57:43 | 显示全部楼层
看不懂~~~~~~~~~~~路过~~~赫赫\
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-3 16:38 , Processed in 0.206913 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表