⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_20318.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:20318 发表者:天马 发表日期:2002-11-05 15:18:52
<br>主题:名字对象到底干什么用呀?哪位高手指点一下,不胜感激
<br>内容:谢谢
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-05 15:25:57
<br>内容:全局空间最大的问题在于它本身仅有一个。在大的软件项目中,经常会有<BR>不少人把他们定义的名字都放在这个单一的空间中,从而不可避免地导致名字<BR>冲突。例如,假设library1.h 定义了一些常量,其中包括:<BR>const double LIB_VERSION = 1.204;<BR>类似的,library2.h 也定义了:<BR>const int LIB_VERSION = 3;<BR>很显然,如果某个程序想同时包含library1.h 和library2.h 就会有问题。对<BR>于这类问题,你除了嘴里骂几句,或给作者发报复性邮件,或自己编辑头文件<BR>来消除名字冲突外,也没其它什么办法。<BR>但是,作为程序员,你可以尽力使自己写的程序库不给别人带来这些问题。<BR>例如,可以预先想一些不大可能造成冲突的某种前缀,加在每个全局符号前。<BR>当然得承认,这样组合起来的标识符看起来不是那么令人舒服。<BR>另一个比较好的方法是使用C++ namespace。namespace 本质上和使用<BR>前缀的方法一样,只不过避免了别人总是看到前缀而已。所以,不要这么做:<BR>const double sdmBOOK_VERSION = 2.0; // 在这个程序库中,<BR>// 每个符号以"sdm"开头<BR>class sdmHandle { ... };<BR>sdmHandle& sdmGetHandle(); // 为什么函数要这样声明?<BR>// 参见条款47<BR>而要这么做:<BR>namespace sdm {<BR>const double BOOK_VERSION = 2.0;<BR>class Handle { ... };<BR>Handle& getHandle();<BR>}<BR>用户于是可以通过三种方法来访问这一名字空间里的符号:将名字空间中<BR>的所有符号全部引入到某一用户空间;将部分符号引入到某一用户空间;或通<BR>过修饰符显式地一次性使用某个符号:<BR>void f1()<BR>{<BR>using namespace sdm; // 使得sdm 中的所有符号不用加<BR>// 修饰符就可以使用<BR>cout &lt;&lt; BOOK_VERSION; // 解释为sdm::BOOK_VERSION<BR>...<BR>Handle h = getHandle(); // Handle 解释为sdm::Handle,<BR>// getHandle 解释为sdm::getHandle<BR>...<BR>}<BR>void f2()<BR>{<BR>using sdm::BOOK_VERSION; // 使得仅BOOK_VERSION 不用加<BR>// 修饰符就可以使用<BR>cout &lt;&lt; BOOK_VERSION; // 解释为<BR>// sdm::BOOK_VERSION<BR>...<BR>Handle h = getHandle(); // 错误! Handle 和getHandle<BR>// 都没有引入到本空间<BR>...<BR>}<BR>void f3()<BR>{<BR>cout &lt;&lt; sdm::BOOK_VERSION; // 使得BOOK_VERSION<BR>// 在本语句有效<BR>...<BR>double d = BOOK_VERSION; // 错误! BOOK_VERSION<BR>// 不在本空间<BR>Handle h = getHandle(); // 错误! Handle 和getHandle<BR>// 都没有引入到本空间<BR>...<BR>}<BR>(有些名字空间没有名字。这种没命名的名字空间一般用于限制名字空间内部<BR>元素的可见性。详见条款M31。)<BR>名字空间带来的最大的好处之一在于:潜在的二义不会造成错误(参见条<BR>款26)。所以,从多个不同的名字空间引入同一个符号名不会造成冲突(假如<BR>确实真的从不使用这个符号的话)。例如,除了名字空间sdm 外,假如还要用<BR>到下面这个名字空间:
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:天马 回复日期:2002-11-08 18:47:35
<br>内容:谢谢仁兄的留言,解决了我的一个问题,命名空间的问题也困惑了我好久,不过我这里的名字对象是指COM中的名字对象,IMONIKER接口的问题?不知仁兄是否知晓?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Erica 回复日期:2002-11-09 14:54:55
<br>内容:你知道类对象吗?名字对象也属于类对象。不过与一般的类对象要高级的多。创建对象时不用GUID用的是字符串。当然名字对象它知道如何将字符串解析并创建或返回正确的对象。编写名字对象相当复杂,不过微软已经写了一些常用的。差不多够用了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:clousea 回复日期:2002-11-15 10:31:25
<br>内容:to erica_sun <BR>如果没有类对象,能不能用名字对象加载组件对象
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -