在vb、c#、javascript这些脚本语言中都有属性这个东西,使用起来相当方便,甚至在COM中也有属性这一说。可偏偏在C++中没有这个,在实现COM的时候使用的是虚函数表,归根揭底COM的属性是使用C++函数来实现的,所以在我们调用的时候总没有个方便的方法来使用属性。不过属性确实是使用起来方便,最起码是书写起来方便。
可能是为了和VB和C#统一吧,所以微软在C++的扩展里面也提供了属性这个东西,跟vb 和c#很相似(对象的属性
property ,不是[]属性attribute 啊),其实就是微软自己的扩展(Microsoft-Specific,不知道如何翻译,微软特有?),所以其他的编译器可是不支持的哦。呵呵~说了一大堆废话,其实就是说在vc++(
VC6中有[1],VC2005中有,相信VC2008中也有)中添加了一个新的关键字__declspec(property)) 。下面就介绍下这个关键字的用法。
[1] 原来没有vc6 环境,没测试,看看文档以为没有呢,其实vc6也支持,今天刚测试了,赶快更正~
在MSND 中的说明为(http://msdn.microsoft.com/en-us/library/yhfk0thd(VS.80).aspx ):
__declspec(property({get=get_func_name|,put=put_func_name}))
__declspec( property( get=get_func_name ) ) declarator
__declspec( property( put=put_func_name ) ) declarator
__declspec( property( get=get_func_name, put=put_func_name ) ) declarator
,这个变量不占用内存,只是个名字而 如何使用呢?先看人家微软给的例子:
1 // declspec_property.cpp
2 struct S {
3 int i;
4 void putprop(int j) {
5 i = j;
6 }
7
8 int getprop() {
9 return i;
10 }
11
12 __declspec(property(get = getprop, put = putprop)) int the_prop;
13 };
14
15 int main() {
16 S s;
17 s.the_prop = 5; //这里其实就是调用的putprop方法
18 return s.the_prop; //而这里调用的就是getprop方法了
19 }
很简单吧~,msdn上的描述是英文的,俺就不翻译了,英文水平很次,大意是编译器把这个声明当成一个虚拟数
据变量(virtual data members, 俺就直接说属性更容易理解),这个其实只是个符号,在编写代码的时候当成
属性来对待,编译的时候编译器会把此属性对应到相应的函数调用,其实还是C++本身的函数调用,只是书写上的
方便,不过如果只是在Windows上的开发,这个也省事不少啊。
如果声明成只读属性那么只要指定get就行,同理只写属性只要指定put就可以了~
简单的属性例子就是这样了,MSDN上貌似介绍的不够详细,如果我们的属性是数组如何对待呢?多维数组呢?
其实数组也是一样的,只是数组需要有参数来传递他的下标,还有个好消息要说的是,这个下标可不仅仅是简
单的整形变量了,只要你想写什么类型的都可以,呵呵~~在COM编程时如果使用了#import 来引入的类库信息,
生成的代码里很多数组就是使用了_variant_t类型哦~,二维或者多维数组呢只是多了几个参数而已,很简单,
不过使用属性的时候一定要是 s.prop[i][j],必须要用数组的形式调用才会映射正确所需要调用的函数啊,否则
会报错滴,俺经常犯的错就是使用了(),失误~~
代码其实就也是一样的了,只是在方法中多传递几个参数而已,这里没环境,代码如下:
1 // declspec_property.cpp
2 struct S {
3 int i[10];
4 void putprop(int index,int var) {
5 i[index] = var;
6 }
7
8 int getprop(int index) {
9 return i[index];
10 }
11
12 __declspec(property(get = getprop, put = putprop)) int the_prop[];
13 };
14
15 int main() {
16 S s;
17 s.the_prop[3] = 5; //
18 return s.the_prop[3]; //
19 }
算是写完了,呵呵~~这个比较简单~~
posted on 2008-07-25 15:04
静静的想 阅读(868)
评论(0) 编辑 收藏 引用 所属分类:
C/C++ 、
Windows/COM开发