| | | Visual C++ .NET编程:托管C++概述 | | 2002-04-02·
·Adding··yesky
| 上一页 1 2 3 4 (4) 简化属性操作
在__gc类中可以使用.NET的属性,这个属性简化了属性函数的调用操作,这与标准C++中的属性不一样。在标准C++中分别通过get_和put_成员函数来设置或获取相关属性的值。现在,托管C++中的属性操作就好比是对一个属性变量进行操作,例如下列代码:
#using using namespace System;
__gc class G { public: __property int get_Size() { Console::WriteLine(S"get_属性"); return nSize; }; __property void set_Size(int i) { Console::WriteLine(S"set_属性"); nSize = i; }; private: int nSize; };
int main() { G * pG = new G; pG->Size = 10; // 调用set_Size int i = pG->Size; // 调用get_Size Console::WriteLine(i); } | 程序结果为:
set_属性
get_属性
10
需要说明的是,托管C++使用__property关键字来定义一个属性的成员函数。从代码中可以看出设置和获取属性的成员函数名称中分别使用了set_和get_,这样编译器会自动生成一个伪成员变量Size,这个变量名是set_和get_成员函数后面的名称。注意不要再在get_成员函数代码中使用这个伪成员变量Size,它会引起该函数的递归调用。
(5) 托管C++的委派
在C/C++中,一个函数的地址就是内存地址。这个地址不会带有任何其它附加信息,如函数的参数个数、参数类型、函数的返回值类型以及这个函数的调用规范等。总之,C/C++的回调函数不具备类型安全性。而.NET框架在回调函数的基础增加了提供类型安全的机制,称为委派。
托管C++的委派方法不像C#那么复杂,它简化了委派绝大部分的内部机制,因而使得它的使用变成非常简单容易。例如下面的代码:
#using using namespace System;
__delegate int GetDayOfWeek(); // 委派方法的声明 __gc class MyCalendar { public: MyCalendar() : m_nDayOfWeek(4) {} int MyGetDayOfWeek() { Console::WriteLine("非静态方法"); return m_nDayOfWeek; } static int MyStaticGetDayOfWeek() { Console::WriteLine("静态方法"); return 6; } private: int m_nDayOfWeek; };
int main(void) { GetDayOfWeek * pGetDayOfWeek; // 声明委派类型变量 int nDayOfWeek;
// 将类的静态方法MyStaticGetDayOfWeek绑定成委派 pGetDayOfWeek = new GetDayOfWeek(0, &MyCalendar::MyStaticGetDayOfWeek); nDayOfWeek = pGetDayOfWeek->Invoke(); // 委派的调用 Console::WriteLine(nDayOfWeek);
// 将一个类的实例绑定成委派 MyCalendar * pcal = new MyCalendar(); pGetDayOfWeek = static_cast(Delegate::Combine(pGetDayOfWeek, new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek))); nDayOfWeek = pGetDayOfWeek->Invoke(); Console::WriteLine(nDayOfWeek);
// 删除绑定委派的类实例 pGetDayOfWeek = static_cast(Delegate::Remove(pGetDayOfWeek, new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
return 0; } | 输出结果是:
静态方法 6
静态方法
非静态方法
4
4、结速语
总之,使用托管C++是C++程序员编写.NET框架应用程序最好的一种选择,在充分理解.NET框架基础上,避免了使用其他语言如C#、VB.NET所带来的额外开销。
上一页 1 2 3 4 | | | 感谢
访问天极网,如果您觉得该文章涉及版权问题,请看这里!
|
|