C++ Builder和托管C++中属性的使用建议

原创 2004年06月05日 20:49:00

C++ Builder和托管C++中属性的通用建议:
    1.类的任何成员变量尽量都对应相应的属性.外部不能访问的成员变量用protected或者private属性.
    2.类的任何成员变量尽量通过属性访问.不管是类内部访问自己的成员变量还是类外部访问类内部的成员变量.
    3.除属性对应的函数,构造函数,析构函数等特殊的函数外,类的内部访问自己的成员变量时尽量用属性.
    4.属性尽量用于简单的数据类型或者简单的类.即属性的类型最好是简单的数据类型或者简单的类.
    5.C++Builder中:复杂类型的属性,用指针或者对象的应用.
      托管C++中:复杂类型的属性,用函数代替.建议用Get和Set打头对应于属性的读和写.
     注:这一条有时候我们容易忽视,是因为我很容易忘记C++中的默认拷贝构成函数,在函数中当参数是复杂对象时,也存在类似的问题.
C++Builder中对第5条的解释:详细源码见示例工程

//SampleClassUnit.H 文件
//---------------------------------------------------------------------------

#ifndef SampleClassUnitH
#define SampleClassUnitH
//---------------------------------------------------------------------------

#include <Classes.hpp>

//---------------------------------------------------------------------------
class TBasic
{
private: // User declarations
public:  // User declarations
    int m_iNum;
    int * m_pNum;
public:  // User declarations
    __fastcall TBasic();
    __fastcall ~TBasic();
};

//---------------------------------------------------------------------------
class THeritor
{
private:  // User declarations
    TBasic __fastcall GetBasicObject();

    TBasic * __fastcall GetBasicPointer();

    TBasic & __fastcall GetBasicReference();
public:  // User declarations
    TBasic m_Basic;

    TBasic * m_pBasic;

    TBasic m_BasicReference;
public:  // User declarations
    __fastcall THeritor();
    __fastcall ~THeritor();
public:
    __property TBasic BasicObject  = { read=GetBasicObject};
    __property TBasic * BasicPointer  = { read=GetBasicPointer};
    __property TBasic & BasicReference  = { read=GetBasicReference};
};

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#endif

//SampleClassUnit.cpp文件
//---------------------------------------------------------------------------


#pragma hdrstop

#include "SampleClassUnit.h"

#pragma package(smart_init)

//---------------------------------------------------------------------------
__fastcall TBasic::TBasic()
{
    m_iNum = 10;

    m_pNum = new int(100);
}

__fastcall TBasic::~TBasic()
{
    delete m_pNum;
    m_pNum = NULL;
}

//---------------------------------------------------------------------------
__fastcall THeritor::THeritor()
{
    m_pBasic = new TBasic();
}

__fastcall THeritor::~THeritor()
{
    delete m_pBasic;
    m_pBasic = NULL;
}

//---------------------------------------------------------------------------
TBasic __fastcall THeritor::GetBasicObject()
{
    return m_Basic;
}

TBasic * __fastcall THeritor::GetBasicPointer()
{
    return m_pBasic;
}

TBasic & __fastcall THeritor::GetBasicReference()
{
    return m_BasicReference;
}
//---------------------------------------------------------------------------

//测试函数
void __fastcall TSampleForm::Button1Click(TObject *Sender)
{
    //指针属性
    if (m_pHeritor != NULL)
    {
        TBasic * pBasic = m_pHeritor->BasicPointer;
        int iNum = pBasic->m_iNum;
        RichEdit1->Lines->Add("m_iNum=" + IntToStr(iNum));
        if (pBasic->m_pNum != NULL)
        {
            int ipNum = *(pBasic->m_pNum);
            RichEdit1->Lines->Add("m_pNum=" + IntToStr(ipNum));
        }
        else
        {
            RichEdit1->Lines->Add("m_pNum=NULL!");
        }
    }
}
//---------------------------------------------------------------------------

void __fastcall TSampleForm::Button2Click(TObject *Sender)
{
    //引用属性
    if (m_pHeritor != NULL)
    {
        TBasic * pBasic = &(m_pHeritor->BasicReference);
        int iNum = pBasic->m_iNum;
        RichEdit1->Lines->Add("m_iNum=" + IntToStr(iNum));
        if (pBasic->m_pNum != NULL)
        {
            int ipNum = *(pBasic->m_pNum);
            RichEdit1->Lines->Add("m_pNum=" + IntToStr(ipNum));
        }
        else
        {
            RichEdit1->Lines->Add("m_pNum=NULL!");
        }
    }
}
//---------------------------------------------------------------------------

void __fastcall TSampleForm::Button3Click(TObject *Sender){
    //对象属性
    if (m_pHeritor != NULL)
    {
        TBasic * pBasic = &(m_pHeritor->BasicObject);
        int iNum = pBasic->m_iNum;
        RichEdit1->Lines->Add("m_iNum=" + IntToStr(iNum));
        if (pBasic->m_pNum != NULL)
        {
            int ipNum = *(pBasic->m_pNum);
            RichEdit1->Lines->Add("m_pNum=" + IntToStr(ipNum));
        }
        else
        {
            RichEdit1->Lines->Add("m_pNum=NULL!");
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TSampleForm::Button4Click(TObject *Sender)
{
    //指针
    if (m_pHeritor != NULL)
    {
        TBasic * pBasic = m_pHeritor->m_pBasic;
        int iNum = pBasic->m_iNum;
        RichEdit1->Lines->Add("m_iNum=" + IntToStr(iNum));
        if (pBasic->m_pNum != NULL)
        {
            int ipNum = *(pBasic->m_pNum);
            RichEdit1->Lines->Add("m_pNum=" + IntToStr(ipNum));
        }
        else
        {
            RichEdit1->Lines->Add("m_pNum=NULL!");
        }
    }
}
//---------------------------------------------------------------------------

void __fastcall TSampleForm::Button5Click(TObject *Sender)
{
    //引用
    if (m_pHeritor != NULL)
    {
        TBasic * pBasic = &(m_pHeritor->m_BasicReference);
        int iNum = pBasic->m_iNum;
        RichEdit1->Lines->Add("m_iNum=" + IntToStr(iNum));
        if (pBasic->m_pNum != NULL)
        {
            int ipNum = *(pBasic->m_pNum);
            RichEdit1->Lines->Add("m_pNum=" + IntToStr(ipNum));
        }
        else
        {
            RichEdit1->Lines->Add("m_pNum=NULL!");
        }
    }
}
//---------------------------------------------------------------------------

void __fastcall TSampleForm::Button6Click(TObject *Sender)
{
    //对象
    if (m_pHeritor != NULL)
    {
        TBasic * pBasic = &(m_pHeritor->m_Basic);
        int iNum = pBasic->m_iNum;
        RichEdit1->Lines->Add("m_iNum=" + IntToStr(iNum));
        if (pBasic->m_pNum != NULL)
        {
            int ipNum = *(pBasic->m_pNum);
            RichEdit1->Lines->Add("m_pNum=" + IntToStr(ipNum));
        }
        else
        {
            RichEdit1->Lines->Add("m_pNum=NULL!");
        }
    }
}
//---------------------------------------------------------------------------

 

托管C++中:
    当你的类用于WebService中的时候,当WebService客户端向服务器请求该类的一个对象时,服务器会把该类的相关数据格式化为XML文件传到客户端,其中包括所有属性的值.如果属性包括复杂类型时,可能导致属性中有对象,对象中又有属性,以至于嵌套很深,服务器格式化对象数据为XML文档就要花费很长时间,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


    1.属性最好不要用于返回复杂对象上.如属性得到的是自定义的对象,或者一些带有指针的对象.这种情况最好是返回对象的指针或者对象的应用的属性.因为当返回对象的属性,会调用对象的拷贝构造函数,一来系统开销大,二来当通过属性得到的对象的副本在超出其作用域时析构时可能调用你自己的析构函数将对象中的指针所指的对象析构调.

C++ Builder组件属性详解

C++builder组件属性详解 尽管C++Builder的组件种类繁多,每种组件又都有许多不同的属性,但是在这些众多的属性中有相当一部分是大多数组件所共有的。因此我们应当主要掌握这些共有组...
  • goodai007
  • goodai007
  • 2011年11月18日 17:40
  • 4056

关于C++托管和非托管

所谓托管是指内存管理由系统而不是由程序员管理。 像C#这样的语言的内存管理(内存的分配和释放)都是由系统管理的。所以只有new而没有delete。 C++有个很重要的特点就是内存由程序员管理。所以...
  • sd791002
  • sd791002
  • 2017年06月20日 16:17
  • 356

C++/CLI 托管C++之类、属性封装【7】

CLI封装类时,涉及确定性析构与非确定性析构,属性封装使用property。 【1】C++导出类 class EXPORTDLL_CLASS CAddSub { public: CAdd...
  • aoshilang2249
  • aoshilang2249
  • 2015年01月01日 15:41
  • 1930

C++/CLI 托管C++的数组介绍【4】

托管数组实际是System::Array 类型的对象,因此在 C++/CLI 程序中创建的托管数组能使用该类提供的各种方法和属性。 [1] 定义  [qualifiers] [c...
  • aoshilang2249
  • aoshilang2249
  • 2015年01月01日 09:20
  • 3434

C++/CLI 托管C++的数据类型介绍【2】

CLI: 公共语言基础构造(Common Language Infrastructure),是由ECMA(欧洲计算机制造商协会)成立专家组,并结合ISO 标准、开发形成的一个可扩展语言标准。   ...
  • aoshilang2249
  • aoshilang2249
  • 2015年01月01日 08:52
  • 1237

在C++本地类中添加托管类的变量

使用gcroot可以实现在C++本地类中添加托管类变量.例子:#include  //必须包含using namespace System;using namespace System::Collec...
  • Joe_KingKiller
  • Joe_KingKiller
  • 2009年11月01日 14:37
  • 3864

C#调用托管C++类(DLL)

利用托管C++对C++类进行包装,从而实现在C#中调用C++类。
  • u010049298
  • u010049298
  • 2015年03月06日 22:20
  • 591

使用 C++ 的托管扩展针对 Windows 窗体编程 (转)

发布日期: 8/9/2004 | 更新日期: 8/9/2004Chris Sells 和 Sam Gentile适用于:Microsoft®Visual C++® .NETWindows Forms摘...
  • eblog
  • eblog
  • 2004年09月20日 15:29
  • 4114

托管C++的一次编程经历

最近我发现,从前用一个C#编写的文件管理程序在处理大批量文件的时候,其内存占用量过高(数百兆),而且性能也很不稳定(忽快忽慢,估计和垃圾收集机制有关)。考虑程序本身的因素之后,觉得已经没有多少优化余地...
  • yuhao_programer
  • yuhao_programer
  • 2005年02月16日 13:20
  • 2530

C#中使用托管C++类,委托调用,以供托管C++类的成员函数回调的实现方式

简单介绍了在C#下面调用C++的托管类的成员函数,传入委托(函数指针),再在C++中回调C#的函数代码,...
  • ganmin167
  • ganmin167
  • 2016年09月22日 10:30
  • 2247
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Builder和托管C++中属性的使用建议
举报原因:
原因补充:

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