程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC不定參數的傳遞和自定義異常的拋出

VC不定參數的傳遞和自定義異常的拋出

編輯:關於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.
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 = '\0', ...);//向屬性列表中增加下列選項
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_arg va_end是三個宏,內容參照mfc代碼
125. for (strArg = va_arg(argList, LPCTSTR); //按LPCTSTR類型獲取下一個參數的地址,並提取參數值,這裡的參數類型必須自己指定,Format是根據%s,%c等符號來判斷的
126.strArg != NULL; //判斷參數是否0,即最後一個參數,所以這裡約定最後一個參數必須傳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.}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved