VC不定參數(shù)的傳遞和自定義異常的拋出

字號:

一,在vc自定義函數(shù)中傳定不定個數(shù)的參數(shù),即如format函數(shù)中的第二個參數(shù)"...",能接收任意個數(shù)參數(shù);
    二,自定義異常的拋出,即throw一個自定義異常.
    函數(shù)代碼列如下:
    //ComboProp.h:interfacefortheCComboPropclass.
    //
    //////////////////////////////////////////////////////////////////////
    #if!defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
    #defineAFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_
    #if_MSC_VER>1000
    #pragmaonce
    #endif//_MSC_VER>1000
    #include"bcgpproplist.h"
    classCSelItemException:publicCException//trow的異常類的定義
    {
    public:
    CSelItemException(constint&SelIndex,constint&ItemCount)//修改構(gòu)造函數(shù),使catch時可以獲取要報告的參數(shù)
    {
    this->m_IndextoSeled=SelIndex;
    this->m_ItemCount=ItemCount;
    }
    CSelItemException(CSelItemException&m)//缺省拷貝構(gòu)造函數(shù),若沒有這個函數(shù),則需要使用throw&CSelItemException(SeledIndex,pCombo->GetCount());的方式
    {
    this->m_IndextoSeled=m.m_IndextoSeled;
    this->m_ItemCount=m.m_ItemCount;
    }
    virtual~CSelItemException();
    public:
    intm_IndextoSeled;
    intm_ItemCount;
    };
    classCComboProp:publicCBCGPProp
    {
    public:
    CComboBox*CreateCombo(CWnd*pWndParent,CRectrect,intSeledIndex=-1,LPCTSTRItemString1=NULL, ...);
    BOOLAddOption(intnSeledIndex=-1,LPCTSTRItemString1=’’,...);//向?qū)傩粤斜碇性黾酉铝羞x項
    CComboProp(constCString&strGroupName,DWORD_PTRdwData=0,BOOLbIsValueList=FALSE)
    :CBCGPProp(strGroupName,dwData,bIsValueList){}
    CComboProp(constCString&strName,const_variant_t&varValue,LPCTSTRlpszDescr=NULL,
    DWORD_PTRdwData=0,LPCTSTRlpszEditMask=NULL,LPCTSTRlpszEditTemplate=NULL,LPCTSTRlpszValidChars=NULL)
    :CBCGPProp(strName,varValue,lpszDescr,dwData,lpszEditMask,lpszEditTemplate,lpszValidChars){}
    virtual~CComboProp();
    };
    #endif//!defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
    //ComboProp.cpp:implementationoftheCComboPropclass.
    //
    //////////////////////////////////////////////////////////////////////
    #include"stdafx.h"
    #include"GDFCheck.h"
    #include"ComboProp.h"
    #ifdef_DEBUG
    #undefTHIS_FILE
    staticcharTHIS_FILE[]=__FILE__;
    #definenewDEBUG_NEW
    #endif
    //////////////////////////////////////////////////////////////////////
    //Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    CSelItemException::~CSelItemException()
    {
    }
    CComboProp::~CComboProp()
    {
    } BOOLCComboProp::AddOption(intnSeledIndex,LPCTSTRItemString1,...)
    {
    LPCTSTRstrArg=NULL;
    va_listargList;
    va_start(argList,nSeledIndex);//取頭個參數(shù)地址
    _variant_tvtDefault;
    intnCount=0;
    for(strArg=va_arg(argList,LPCTSTR);strArg!=NULL;strArg=va_arg(argList,LPCTSTR))
    {
    CBCGPProp::AddOption(strArg,FALSE);
    if(nSeledIndex==nCount++)
    {
    vtDefault.SetString(strArg);
    }
    }
    va_end(argList);
    if(nSeledIndex>=0)
    {
    if(nSeledIndex    {this->SetValue(vtDefault);
    }
    else
    {
    throwCSelItemException(nSeledIndex,nCount);//拋出設(shè)定異常
    }
    }
    returnTRUE;
    }
    CComboBox*CComboProp::CreateCombo(CWnd*pWndParent,CRectrect,
    intSeledIndex,LPCTSTRItemString1,...)
    {
    CComboBox*pCombo=CBCGPProp::CreateCombo(pWndParent,rect);
    intnArgCout=0;
    LPCTSTRstrArg=NULL;
    va_listargList;
    va_start(argList,SeledIndex);//獲取SeledIndex參數(shù)的地址
    //va_startva_arg va_end是三個宏,內(nèi)容參照mfc代碼
    for(strArg=va_arg(argList,LPCTSTR);//按LPCTSTR類型獲取下一個參數(shù)的地址,考試,大提示提取參數(shù)值,這里的參數(shù)類型必須自己指定,Format是根據(jù)%s,%c等符號來判斷的
    strArg!=NULL;//判斷參數(shù)是否0,即最后一個參數(shù),所以這里約定最后一個參數(shù)必須傳0,或’’;也可以自定義其他截止符
    strArg=va_arg(argList,LPCTSTR))//獲取下一個參數(shù)值
    {
    pCombo->AddString(strArg);
    }
    va_end(argList);//善后工作,體現(xiàn)coder品質(zhì)的地方
    if(SeledIndex>=0)
    {
    if(pCombo->GetCount()>SeledIndex)
    {
    if(pCombo->SetCurSel(SeledIndex)==CB_ERR)
    {
    throwCSelItemException(SeledIndex,pCombo->GetCount());//catch時將調(diào)用CSelItemException的拷貝構(gòu)造函數(shù),若缺少默認(rèn)拷貝構(gòu)造函數(shù)定義則編譯無法通過,報cannotthrowCSelItemException
    }
    }
    else
    {
    throw&CSelItemException(SeledIndex,pCombo->GetCount());//拋出設(shè)定異常
    }
    }
    returnpCombo;
    }