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

     今天下午学习了两点,一,在vc自定义函数中传定不定个数的参数,即如format函数中的第二个参数"...",能接收任意个数参数;二,自定义异常的抛出,即throw一个自定义异常.

  函数代码列如下:
  1. // ComboProp.h: interface for the CComboProp class.
  2. //
  3. //
  4. #if !defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
  5. #define AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "bcgpproplist.h"
  10. class CSelItemException: public CException//trow的异常类的定义
  11. {
  12. public:
  13.  CSelItemException (const int& SelIndex, const int& ItemCount)//修改构造函数,使catch时可以获取要报告的参数
  14.  {
  15.   this->m_IndextoSeled = SelIndex;
  16.   this->m_ItemCount = ItemCount;  
  17.  }
  18.  CSelItemException(CSelItemException& m)//缺省拷贝构造函数,若没有这个函数,则需要使用throw &CSelItemException(SeledIndex, pCombo->GetCount()); 的方式 
  19. {
  20.   this->m_IndextoSeled = m.m_IndextoSeled;
  21.   this->m_ItemCount = m.m_ItemCount;  
  22.  }
  23.  virtual ~CSelItemException();
  24. public:
  25.  int m_IndextoSeled;
  26.  int m_ItemCount;
  27. };
  28. class CComboProp : public CBCGPProp  
  29. {
  30. public:
  31.  CComboBox* CreateCombo(CWnd*pWndParent, CRect rect, int SeledIndex = -1, LPCTSTR ItemString1 = NULL,  ...);
  32.  BOOL AddOption (int nSeledIndex = -1, LPCTSTR ItemString1 = '/0', ...);//向属性列表中增加下列选项
  33.  CComboProp(const CString&strGroupName,DWORD_PTR dwData=0,BOOL bIsValueList=FALSE)
  34.   : CBCGPProp (strGroupName, dwData, bIsValueList){}
  35.  CComboProp(const CString&strName,const _variant_t&varValue,LPCTSTR lpszDescr=NULL,
  36.   DWORD_PTR dwData=0,LPCTSTR lpszEditMask=NULL,LPCTSTR lpszEditTemplate=NULL,LPCTSTR lpszValidChars=NULL)
  37.   : CBCGPProp (strName,varValue,lpszDescr,dwData,lpszEditMask,lpszEditTemplate,lpszValidChars){}
  38.  virtual ~CComboProp();  
  39. };
  40. #endif // !defined(AFX_COMBOPROP_H__B155C456_9EA6_42DB_87B9_30540D83B5D8__INCLUDED_)
  41. // ComboProp.cpp: implementation of the CComboProp class.
  42. //
  43. //
  44. #include "stdafx.h"
  45. #include "GDFCheck.h"
  46. #include "ComboProp.h"
  47. #ifdef _DEBUG
  48. #undef THIS_FILE
  49. static char THIS_FILE[]=__FILE__;
  50. #define new DEBUG_NEW
  51. #endif
  52. //
  53. // Construction/Destruction
  54. //
  55. CSelItemException::~CSelItemException()
  56. {
  57. }
  58. CComboProp::~CComboProp()
  59. {
  60. }
  61. BOOL CComboProp::AddOption (int nSeledIndex, LPCTSTR ItemString1, ...)
  62. {
  63.  LPCTSTR strArg = NULL;
  64.  va_list argList;
  65.  va_start(argList, nSeledIndex); //取头个参数地址
  66.  _variant_t vtDefault;
  67.  int nCount = 0;
  68.  for (strArg = va_arg(argList, LPCTSTR); strArg != NULL; strArg = va_arg(argList, LPCTSTR))
  69.  {
  70.   CBCGPProp::AddOption(strArg, FALSE);
  71.   if (nSeledIndex == nCount++)
  72.   {
  73.    vtDefault.SetString(strArg);
  74.   }
  75.  }
  76.  va_end(argList);
  77.  if (nSeledIndex >= 0)
  78.  {
  79.   if (nSeledIndex < nCount)
  80.   {
  81.    this->SetValue(vtDefault);
  82.   }
  83.   else
  84.   {
  85.    throw CSelItemException(nSeledIndex, nCount); //抛出设定异常 
  86.   }  
  87.  }
  88.  return TRUE;
  89. }
  90. CComboBox* CComboProp::CreateCombo(CWnd *pWndParent, CRect rect, 
  91.            int SeledIndex, LPCTSTR ItemString1, ...)
  92. {
  93.  CComboBox* pCombo = CBCGPProp::CreateCombo(pWndParent, rect);
  94.  int nArgCout = 0; 
  95.  LPCTSTR strArg = NULL;
  96.  va_list argList;
  97.  va_start(argList, SeledIndex); //获取SeledIndex参数的地址
  98.   
  99. //va_start va_arg  va_end是三个宏,内容参照mfc代码
  100.  for (strArg = va_arg(argList, LPCTSTR); //按LPCTSTR类型获取下一个参数的地址,并提取参数值,这里的参数类型必须自己指定,Format是根据%s,%c等符号来判断的
  101. strArg != NULL; //判断参数是否0,即最后一个参数,所以这里约定最后一个参数必须传0,或'/0';也可以自定义其他截止符
  102. strArg = va_arg(argList, LPCTSTR))//获取下一个参数值
  103.  {
  104.   pCombo->AddString(strArg);
  105.  }
  106.  va_end(argList); //善后工作,体现coder品质的地方
  107.  if (SeledIndex >= 0)
  108.  {
  109.   if (pCombo->GetCount() > SeledIndex)
  110.   {
  111.    if (pCombo->SetCurSel(SeledIndex) == CB_ERR)
  112.    {    
  113.     throw CSelItemException(SeledIndex, pCombo->GetCount()); //catch时将调用CSelItemException的拷贝构造函数,若缺少默认拷贝构造函数定义则编译无法通过,报cannot throw CSelItemException
  114.    }
  115.   }
  116.   else
  117.   {
  118.    throw &CSelItemException(SeledIndex, pCombo->GetCount()); //抛出设定异常   
  119.   }
  120.  }
  121.  return pCombo;
  122. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值