Visual C++的“虚拟属性”功能

C++专栏 专栏收录该内容
4 篇文章 0 订阅

Microsoft Visual C++的“虚拟属性”功能

 

译者注:

       本文简单介绍了使用Microsoft Visual C++中的__declspec关键字来实现“属性(Property)”这个C++中没有的特性的方法。有关__declspec关键字的更详细的信息,可以参考MSDN

       __declspec关键字不是标准C++的一部分,因此这种实现“属性”的方法只适用于Visual C++,如果想要了解在标准C++中模拟实现“属性”的方法,请参考:

http://www.csdn.net/develop/read_article.asp?id=18361

 

正文:

       很多遗留下来的传统C++代码中常常会出现用publicprotected关键字修饰的成员变量,您可以直接去访问它们(译者注,如果是protected,是指可以在其派生类中直接访问),而不是通过一组简单的get/set方法。举个例子来说,如下的结构定义就是这样的情况:

typedef struct tagMyStruct

   long m_lValue1; 
   ...             // Rest of the structure definition.
} SMyStruct;

在使用这个结构体的客户端程序中就可以看到散布着大量类如下面列出的代码:

SMyStruct       MyStruct;
long            lTempValue;

MyStruct.m_lValue1 = 100;       // Or any other value that is to be assigned to it.
...
lTempValue = MyStruct.m_lValue1;

    在这种情况下,一旦这段代码需要在一个多线程的环境下应用,你就会遇到一个麻烦。因为没有get/set方法的存在,你不可能简单的在SMyStruct的定义中加上一个临界区(或互斥量)来保护包括m_lValue1在内的所有公有成员变量。

       如果您是使用Microsoft Visual C++编译器,您就可以很方便的找到一个解决这个问题的方案。

       您只需把您的结构体重写为如下的形式:

typedef struct tagMyStruct

   __declspec(property(get=GetValue1, put=PutValue1))
   long  m_lValue1; 
   ...                // Rest of the structure definition. 
   long GetValue1() 
   { 
      // Lock critical section 
      return m_lInternalValue1; 
      // Unlock critical section. 
   } 
   void PutValue1(long lValue) 
   { 
      // Lock critical section 
      m_lInternalValue1 = lValue; 
      // Unlock critical section 
   }
private: 
   long m_lInternalValue1; 
        // Define critical section member variable.
} SMyStruct;

       这就是您要做的全部!

       在这以后,对于如下的代码:

MyStruct.m_lValue1 = 100

       编译器会自动转换为:

MyStruct.PutValue(100)

对于如下的代码:

lTempValue = MyStruct.m_lValue1

编译器会自动转换为:

lTempValue = MyStruct.GetValuel()

这样的特性能带来很多有用的功能,您甚至可以用它为您原来的结构体或类加上引用计数的功能!

 

译者补充:

对于类如数组的情况,VC也提供了相应的支持,如下的例子:

#include <iostream>
using namespace std;

class
MyStruct
{
public:
   __declspec(property(get=GetValue1, put=PutValue1))
   int t[][]; //以二维数组来演示
   int GetValue1(int x, int y) //x,y分别对应第一维和第二维的下标
   { 
      return m_lInternalValue1[x][y]; 
   } 
   void PutValue1(int x,int y, int lValue) //x,y分别对应第一维和第二维的下标,lValue为要赋的值
   { 
      m_lInternalValue1[x][y] = lValue; 
   }
private
   int m_lInternalValue1[3][3]; 
      
};

int
main()
{
    MyStruct ms;
    for (int i = 0; i < 3; i++)
       for (int j = 0; j < 3; j++)
           ms.t[i][j] = i * j;
    return 0;
}

VC6VC7中,对于多维数组的处理略有不同,如上面的

   __declspec(property(get=GetValue1, put=PutValue1))
   int t[][];

VC6中可以简单的写成int t[];即可支持两维的数组,而在VC7中必须写成int t[][];才可以。

 

       原文选自:http://www.codeproject.com/cpp/virtual_property.asp

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

含本书全部源码(1-16章) 共399个实例: 第1章 窗体与界面设计   1.1 菜单应用实例   cc实例001 在系统菜单中添加菜单项   cc实例002 带图标程序菜单   cc实例003 根据表中数据动态生成菜单   cc实例004 浮动菜单   1.2 弹出菜单应用实例   cc实例005 在控件上单击右键弹出菜单   cc实例006 个性化弹出菜单   cc实例007 任务栏托盘弹出菜单   1.3 工具栏应用实例   cc实例008 带背景工具栏   cc实例009 带图标工具栏   cc实例010 带下拉菜单工具栏   cc实例011 可调整按钮位置工具栏   cc实例012 浮动工具栏   cc实例013 根据表中数据动态生成工具栏   cc实例014 具有提示功能工具栏   1.4 状态栏应用实例   cc实例015 带进度条状态栏   cc实例016 动画效果状态栏   cc实例017 滚动字幕状态栏   1.5 导航界面应用实例   cc实例018 Outlook导航界面   cc实例019 树状导航界面   cc实例020 按钮导航界面   cc实例021 类QQ导航菜单   1.6 界面窗体应用实例   cc实例022 背景为渐变色程序界面   cc实例023 椭圆形程序界面   cc实例024 自绘窗体界面   cc实例025 类似WindowscXP程序界面   cc实例026 窗体融合技术   cc实例027 限制对话框最大时窗口大小   1.7 多媒体宣传光盘应用实例   cc实例028 多媒体宣传光盘主界面   cc实例029 自动运行多媒体宣传光盘   1.8 多媒体触摸屏程序应用实例   cc实例030 采购中心多媒体触摸屏程序   cc实例031 为触摸屏程序添加虚拟键盘   1.9 窗体位置应用实例   cc实例032 不可移动窗体   cc实例033 始终在最上面窗体   cc实例034 动画显示窗体   cc实例035 以时钟显示界面窗体   1.10 窗体标题栏应用实例   cc实例036 闪烁窗体标题栏   cc实例037 拖动没有标题栏窗体   cc实例038 禁用标题栏上最大化.c最小化或关闭按钮   1.11 窗体形状及应用   cc实例039 半透明窗体   cc实例040 创建字型窗体   cc实例041 百叶窗窗体   cc实例042 类似Office助手  第2章 控件应用   2.1 按钮控件典型实例   cc实例043 AVI动画按钮   cc实例044 GIF动画按钮   cc实例045 图文按钮   cc实例046 不规则按钮   2.2 EditBox控件典型实例   cc实例047 为EditBox设置新系统菜单   cc实例048 为EditBox控件添加列表选择框   cc实例049 多彩边框编辑框   cc实例050 改变编辑框文本颜色   2.3 ListBox控件典型实例   cc实例051 利用ListBox控件实现标签式数据选择   cc实例052 在ListBox控件间实现数据交换   cc实例053 列表项提示条   2.4 ComboBox控件典型实例   cc实例054 将数据表中字段添加到ComboBox控件   cc实例055 带查询功能ComboBox控件   cc实例056 自动调整组合框宽度   cc实例057 颜色组合框   cc实例058 多列显示组合框   2.5 ListControl控件典型实例   cc实例059 将数据库中数据表添加到ListControl控件   cc实例060 利用ListControl控件浏览数据   cc实例061 利用ListControl控件制作导航界面   cc实例062 在列表视图中拖动视图项   cc实例063 利用列标题对列表视图进行数据排序   cc实例064 具有文本录入功能ListControl控件   2.6 TreeControl控件典型实例   cc实例065 多级数据库树状结构数据显示   cc实例066 可动态修改节点树状结构   cc实例067 带复选功能树状结构   cc实例068 显示磁盘目录   cc实例069 树型提示框   2.7 RichEdit控件典型实例   cc实例070 利用RichEdit显示Word文档   cc实例071 利用RichEdit控件实现文字定位与标识   cc实例072 利用RichEdit控件显示图文数据   2.8 图形类控件典型实例   cc实例073 图文数据录入   cc实例074 带有滚动条图形控件   2.9 滚动条控件典型实例 
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值