随笔 - 3  文章 - 4  trackbacks - 0
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

防止自己再不好好写,想到的先吧标题写上~~~
给自己一片悬崖,虽然我们都在前进,但只有没了退路的我们才会只想办法前进,而不是另寻出路~
相信自己,就没有什么做不到的~

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


    在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开发

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理