VC不定参数的传递和自定义异常的抛出
2010-07-01 20:43:02 来源:WEB开发网今天下午学习了两点,一,在vc自定义函数中传定不定个数的参数,即如format函数中的第二个参数"...",能接收任意个数参数;二,自定义异常的抛出,即throw一个自定义异常.
函数代码列如下:
//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)//修改构造函数,使catch时可以获取要报告的参数
{
this->m_IndextoSeled=SelIndex;
this->m_ItemCount=ItemCount;
}
CSelItemException(CSelItemException&m)//缺省拷贝构造函数,若没有这个函数,则需要使用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='',...);//向属性列表中增加下列选项
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);//取头个参数地址
_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<nCount)
{this->SetValue(vtDefault);
}
else
{
throwCSelItemException(nSeledIndex,nCount);//抛出设定异常
}
}
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参数的地址
//va_startva_arg va_end是三个宏,内容参照mfc代码
for(strArg=va_arg(argList,LPCTSTR);//按LPCTSTR类型获取下一个参数的地址,并提取参数值,这里的参数类型必须自己指定,Format是根据%s,%c等符号来判断的
strArg!=NULL;//判断参数是否0,即最后一个参数,所以这里约定最后一个参数必须传0,或'';也可以自定义其他截止符
strArg=va_arg(argList,LPCTSTR))//获取下一个参数值
{
pCombo->AddString(strArg);
}
va_end(argList);//善后工作,体现coder品质的地方
if(SeledIndex>=0)
{
if(pCombo->GetCount()>SeledIndex)
{
if(pCombo->SetCurSel(SeledIndex)==CB_ERR)
{
throwCSelItemException(SeledIndex,pCombo->GetCount());//catch时将调用CSelItemException的拷贝构造函数,若缺少默认拷贝构造函数定义则编译无法通过,报cannotthrowCSelItemException
}
}
else
{
throw&CSelItemException(SeledIndex,pCombo->GetCount());//抛出设定异常
}
}
returnpCombo;
}
赞助商链接