__declspec(property...)函数象属性那样使用

__declspec(property...)编译指示符是微软定义的一个针对C语言的扩展,使一个函数象一个属性那样被使用。这样你就可以采用如下的语法形式象在使用VB一样读写一个属性的值: objectPtr->property =
value;       

定义如下:



declarator __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



 



当编译器在成员选择运算符(“.”或“->”)的右侧看到使用此特性声明的数据成员时,它会根据此类表达式是左值还是右值,将运算转换为 get  put 函数。 在更复杂的上下文中(如“+=”),可通过同时执行 get 
put 来执行重写。



__declspec(property...)编译指示符只能针对属性的读写函数使用,并根据属性是否可供读写自动生成对应的调用形式。每个属性可能有GetProperty,
PutProperty,PutRefProperty三个函数,但这个编译符只能生成其中的两种交互形式。比如,Command对象的ActiveConnection属性有GetActiveConnectionPutRefActiveConnection这两个读写函数。而PutRef-的形式在实践中是个好的选择,你可以将一个活动的Connection对象的指针保存在这个属性中。另一方面,Recordset对象则有Get-, Put-, and PutRefActiveConnection操作,但却没有可交互的语法形式。


示例:

class A

{

private:

   int m_Value;

public:

   int get_Value() { return
m_Value; }

   void set_Value( int value ){ 
m_Value = value; }

   __declspec( property( get =
get_Value, put = set_Value ) ) int Value;

};



void main() 

{ 

  A a;

  a.Value = 10;

  printf( "Value = %d\n", a.Value
);

  a.set_Value( 100 );

  printf( "Value = %d\n",
a.get_Value() );

}

输出:10,100

__declspec(property(get = GetINotify)) IEmulatorMgr::INotify* N;
    IEmulatorMgr::INotify* m_pINotify;
    IEmulatorMgr::INotify* GetINotify(void)
    { 
        return m_pINotify;
    }; 

你可能感兴趣的:(__declspec(property...)函数象属性那样使用)