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

原创 2003年05月18日 11:00:00

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

 

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

Microsoft Visual C++的“虚拟属性”功能 译者注:       本文简单介绍了使用Microsoft Visual C++中的__declspec关键字来实现“属性(Property...
  • ljx0305
  • ljx0305
  • 2009年02月06日 13:44
  • 547

Visual Studio2010 配置C/C++项目属性

Visual Studio中2010中的项目中,点击【项目】-->【属性】-->【配置属性】,下面没有【C/C++】等选项! 正常情况下如图: 现在的情况: 这时候该怎么处理呢?还有一种...
  • luolunz
  • luolunz
  • 2013年02月27日 09:48
  • 6900

Visual Studio中的各种工程属性设置经验

1.“工程属性->配置属性->C/C++->输出文件”中设置ASM列表(汇编文件)。注意一般选择汇编程序输出:无列表。当选择无列表时注意ASM列表位置的设置,如果ASM列表位置指定的文件夹不存在,则每...
  • u011519892
  • u011519892
  • 2013年11月20日 16:17
  • 2879

Microsoft Visual Studio控件常用属性简介

Microsoft Visual Studio工具箱提供了大量的基本控件供大家使用,也是大部分初学者做窗体程序必不可少的一部分,笔者概括了一部分常用控件的基本属性供大家参考。由于笔者能力有限,如有错误...
  • sinat_24503693
  • sinat_24503693
  • 2016年07月28日 18:13
  • 2091

Visual Studio配置(6):项目属性页-C/C++(2)

代码生成: 启用字符串池:允许编译器在执行过程中,在程序影像和内存中创建相同字符串的单个只读副本,从而生成较小的程序。 启用最小重新生成: 在首次编译期间,编译器在项目的.idb文件...
  • u012175089
  • u012175089
  • 2017年02月15日 10:56
  • 2490

对于Visual Studio C++ 2008环境中出现运行时MFC对话框中文乱码的解决方案

最近,因为闲的没事,捣鼓了一下GUI编程....让我感觉到,其实程序猿的世界也是无边无际的..... 之前在大学里面学的c语言程序设计,都是基于CUI的,记得上第一课,我们的teacher就说,你们...
  • WSQXHoney520
  • WSQXHoney520
  • 2013年09月17日 11:47
  • 1691

va visual assist 常用的几个功能

1. VA View 用于搜索文件,比如senderInfo.cpp,非常快速。 2.在一个.h文件或者.cpp文件中搜索函数。...
  • zhangbinsijifeng
  • zhangbinsijifeng
  • 2015年07月09日 13:32
  • 613

visual studio 12/13基础c++工程建立使用

本文主要介绍如何使用vs2012新建一个c++项目实现预期的功能,代码具体实现结合了opencv的功能,因此设计到包含文件和库的配置。 代码实现的功能为将一种特定的颜色从一幅图中检测出来,...
  • wjx1290326396
  • wjx1290326396
  • 2017年07月12日 17:41
  • 202

Visual Assist X 实用的功能

你用va么?你用它来干什么?高亮,自动提示?未免大材小用了点,高亮这种东西,任意一个文本编辑器就支持!自动列出方法成员,这个是vs本身就有的功能,只不过va让它自动弹出来罢了,我觉得va最强大的应该是...
  • yann2
  • yann2
  • 2010年10月09日 14:16
  • 7228

visual studio属性管理器(property manager)上各项的含义

1. 属性 管理器以最新版的visual studio 2017为例,新建一个console application。 第一步:view -> Property Manager看到的界面如下图所示:...
  • wu_nan_nan
  • wu_nan_nan
  • 2017年04月11日 16:09
  • 1364
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Visual C++的“虚拟属性”功能
举报原因:
原因补充:

(最多只允许输入30个字)