设为首页收藏本站language 语言切换
查看: 1821|回复: 0
收起左侧

在可管理C++中封装值类型

[复制链接]
发表于 2010-2-25 10:25:07 | 显示全部楼层 |阅读模式
<p >有些时候,一些很简单的事情实现起来并不容易。例如,我们想让一个变量值显示在屏幕上。也许你知道在C++中怎么做,但在VC++6中,要用下面的方法实现:<p ><p ><p ><p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>int x = 3;cout &amp;lt;&amp;lt; &amp;quot;x is &amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; endl;</ccid_code></pre></td></tr></table></ccid_nobr><p >就这么简单。不论你学的“C++入门课”怎样,我打赌你能发现的与这两行代码相似的东西不足你在课程中学到的10%,对吗?<p ><center><font color="#000099"><strong>输出到屏幕</strong></font></center><p >现在,如果要在VC++.NET中创建可管理的C++程序该怎么做?下面是我创建的main():<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>int _tmain(void){    // TODO: Please replace the sample code below     //       with your own.    Console::WriteLine(S&amp;quot;Hello World&amp;quot;);    return 0;}</ccid_code></pre></td></tr></table></ccid_nobr><p >现在你可以把应用Cout的代码拷贝到main()中,在加入了include声明后,就可以执行:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>#include &amp;lt;iostream.h&amp;gt;// ...    Console::WriteLine(S&amp;quot;Hello World&amp;quot;);    int x = 3;    cout &amp;lt;&amp;lt; &amp;quot;x is &amp;quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; endl;</ccid_code></pre></td></tr></table></ccid_nobr><p >这时,你会看到一个警告:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>warning C4995: '_OLD_IOSTREAMS_ARE_DEPRECATED': name was marked as #pragma deprecated</ccid_code></pre></td></tr></table></ccid_nobr><p >解决的方法:借用STL中的IO流的代码,并且导入std 名称空间:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>#include &amp;lt;iostream&amp;gt;using namespace std;</ccid_code></pre></td></tr></table></ccid_nobr><p >现在编译并运行这段代码。但是让我不解的是,在程序中发现作为cout应用的Console::WriteLine()。另外,Console::WriteLine很整洁。就像printf,它在字符串中使用占位符显示变量值应该放到哪。下面是一个c#控制程序中的代码:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>int x = 3;Console.WriteLine(&amp;quot;x is {0}&amp;quot;,x);</ccid_code></pre></td></tr></table></ccid_nobr><p >{0}是一个占位符,第二个参数的值截止到占位符出现的位置。因此我想像在c#中一样,在可管理的c++程序中一直使用Console::WriteLine。但是如果你把代码直接拷到c++程序中,并将.改为::,程序不能通过编译。错误显示为:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>error C2665: 'System::Console::WriteLine' : none of the 19 overloads can convert parameter 2 from type 'int'        boxpin.cpp(7): could be 'void System::Console::WriteLine(System::String __gc *,System::Object __gc *)'        boxpin.cpp(7): or       'void System::Console::WriteLine(System::String __gc *,System::Object __gc * __gc[])'        while trying to match the argument list '(char [9], int)'</ccid_code></pre></td></tr></table></ccid_nobr><p >现在,我固执地希望c++能做其他.net语言能做的所有事情,甚至更多。为什么这么简单的办法行不通?没别的办法,看看错误提示吧。我给第二个参数赋一个整数值,它就像一个指针。事实上,是一类指向System::Object的指针(当然,还有由其衍生出的类),一类指向__gc object的指针。而这个整数值两种都不是。你可以试着传递&x值,而非x,那样至少是一个指针,但还是无济于事。<p >WriteLine()需要的是一个指向对象的指针。你不能直接将整数值传递给WriteLine(),因为它是(处于整体性的考虑)用来处理指向垃圾收集对象的指针,而不是其他的。为什么?基本类库中的所有内容都是针对对象设计的,因为他们都可有成员函数——并不是所有的.net语言都支持模式化或是过载模式化运算符的思想。比如,由System::Object继承下来的所有对象都有一个ToString() 方法。你不想为一个非对象的整数写一个类,然后又写一个ToString()来处理它,在每次将它传递给像WriteLine()基本类库中的方法的时候,还要把它放入(或取出)。这时,你怎么把整数传递给WriteLine()?<p ><center><font color="#000099"><strong>_box关键字</strong></font></center><p >可管理的c++也被称为c++可管理的扩展。扩展是指额外关键字,都是以双下划线开头,并被增加到语言中。和其他所有以双下划线开始的关键字一样,他们的编译器是特定的——不要在vc++6和其他产商的编译器中试用。在编译WriteLine() 时,你只会在错误信息中看到_gc。它代表着垃圾收集并且指向一个依靠堆栈类型,并由运行时间控制的对象。_box关键字可以解决我在上面提到的,如何将整数传给基本类库方法,它得到的是System::Object _gc而不是一个整数。下面是它的使用方法:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>Console::WriteLine(&amp;quot;x is {0}&amp;quot;,__box(x));</ccid_code></pre></td></tr></table></ccid_nobr><p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-10 13:15 , Processed in 0.066231 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

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