VC不定参数的传递和自定义异常的抛出

2026-03-23
一,在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  {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;
  }