|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.net老师不吝赐教,为小弟这一批迷途的羊羔指一条阳光之道!您也知道:学习技术如果只有一个人摸索,那是一件多么痛苦的事情!还有,如果万辛能得名师或长者指点,那又是多么一件幸福和快乐的事情!比来做了一个C++CLI的项目,感到仍是有良多注重事项的。如今写上去与人人分享,但愿能对人人有所匡助。本文不会会商更多实际上的工具,只会从有用角度动身,把相干语法内容过一遍。
1)属性
C++CLI声明属性,必要利用property关头字。在属性内,必要经由过程get函数、set函数来设定公有的field值。
万万别忘了,在属性声明停止后要加分号。
利用C#声明属性:
<br>
<br>Code
privateint_age;
publicAge
{
get{return_age;}
set
{
if(0>value||value>=150)
thrownewException();
_age=value;
}
}
利用C++CLI声明属性:
Code
private:
int_age;
public:
propertyintAge
{
intget(void){return_age;};
voidset(intvalue)
{
if(0>value||value>=150)
throwgcnewException();
_age=value;
};
};
2)办法
当利用override关头字重载虚办法,大概利用new关头字掩盖基类办法时,关头字要写在办法称号和参数列表前面。
利用C#声明:
Code
<br>publicclassA
<br>{
<br>
<br>publicintAdd(inta,intb)
<br>{returna+b;}
<br>}
<br>
<br>publicclassB:publicA
<br>{
publicnewintAdd(inta,intb)
<br>{returna+b;}
<br>}
<br>
<br>protectedoverridevoidOnPaint(PaintEventArgspevent)利用C++CLI声明:
Code
<br>publicrefclassA
<br>{
publicintAdd(inta,intb)
<br>{returna+b;}
<br>}
<br>
<br>publicrefclassB:publicA
<br>{
<br>public:
intAdd(inta,intb)new
<br>{returna+b;)
<br>}
<br>
<br>protectedvoidOnPaint(PaintEventArgspevent)override3)事务:
这是C++CLI中对照烦人的部分,代码声明相似于属性声明。事务中的两个默许函数是add和remove。
利用C++CLI声明事务:
Code
<br>private:
<br>EventHandler^_AxDownloadComplete;
<br>public:
<br>virtualeventEventHandler^AxDownloadComplete
<br>{
<br>virtualvoidadd(EventHandler^value)
<br>{
<br>_AxDownloadComplete+=value;
<br>};
<br>virtualvoidremove(EventHandler^value)
<br>{
<br>_AxDownloadComplete-=value;
<br>};
<br>};
4)参数
在C#必要传送援用,利用ref关头字。在C++CLI中与之对应的是%,在C++CLI中没有out关头字。
利用C#声明:
Code
<br>publicvoidGetObject(refObjecto);
<br>利用C++CLI声明:
Code
<br>public:
<br>GetObject(Object^%o);
5)创立对象
在C++CLI中能够经由过程new关头字创立非托管对象。利用gcnew创立托管对象。编译器在编译时会主动反省对象的范例。
6)完成接口
在C#中,一个类无需显式的承继接口。好比:
Code
<br>publicinterfaceITest
<br>{
BackColor
<br>{get;set;}
<br>}
<br>
<br>publicclassMyControl:Control,ITest
<br>{
<br>//无需显式的声明BackColor属性,觉得基类Control,已含有BackColor的完成了。
<br>}
假如在C++CLI中依照下面的相似写法,将会失掉一个C3766编译毛病。编译器提醒代码中未能完成ITest接口。以下的两种写法
都将会招致C3766毛病:
Code
publicinterfaceclassITest
{
intAdd(inta,intb);
};
publicrefclassImpl:ITest
{
};//errorC3766
publicinterfaceclassITest
{
intAdd(inta,intb);
};
publicrefclassImpl:ITest
{
public:
intAdd(inta,intb){returna+b;}
};//errorC3766
人人大概会对第二种写法也会到致编译器呈报C3766毛病而感应惊奇。其次要缘故原由是,C++完成多态次要是经由过程
虚表来完成的。将必要完成多态的函数指针在运转时放进虚表中,在挪用时,体系查询虚表,找到对应的指向虚函数的指针,
最初挪用实行。
准确的写法应当是:
Code
<br>publicinterfaceclassITest
<br>{
<br>intAdd(inta,intb);
<br>};
<br>
<br>publicrefclassImpl:ITest
<br>{
<br>public:
virtualintAdd(inta,intb)
<br>{returna+b;}
<br>};
将完成办法用virtual关头字润色,以便编译器可以准确辨认该办法为虚办法,将其指向函数的指针放进虚表内。
这就带来一个成绩,假如你声了然一个依据System::Windows::Forms::Control类成员的一个接口IControl,然后声明一个类MyControl,该类承继了System::Windows::Forms::Control类和IControl接口。那末,C++编译器将不会以为MyControl类已完成了IControl接口,而招致大批的编译毛病。缘故原由就是System::Windows::Forms::Control类的年夜部分办法都不是虚办法,C++编译器没法间接把基类的办法放进虚表中完成多态。因而只能本人再将Control类在封装一遍。
来自:http://www.ckuyun.com/michaellee/archive/2008/08/03/1259080.html
捆绑编译器。用户不需要受制于厂家,自己就能将程序在新平台上编译运行。除了牛B轰轰的linux,估计也没有系统捆绑c/c++的编译器,而且许多新平台都无法支持复杂的c/c++编译器在上面直接运行。 |
|