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