📄 classtemplate.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>类别范本(Class template)</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">C++
Gossip: 类别范本(Class template)</a></h1>
可以在C++中使用“类别范本”(Class template),又称“通用类别”(Generic class),举个例子来说,曾经介绍过如何撰写一个自订的阵列类别(以 <a href="CustomExceptionClass.html">自订例外类别</a> 中的SafeArray为例),当时该类别很明显的,只能用于建立int型态的阵列,如果您想要使用于double、char或其它资料型态,难道要一一建立这些类别吗?当然不是,您可以宣告类别为类别范本,让我们的程式码撰写可以提高重覆使用。 <br>
<br>
要宣告一个类别成为样版类别,您可以这么宣告: <br>
<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">template <class 型态名称> </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">class 类别名称{ </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;"> // ........ </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">
<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">};</span><br>
</div>
<br>
在类别定义外部定义的样版函式(在::之前加上<型态名称>),以及如何使用样版类别建立物件,这边直接使用实例来介绍:<br>
<ul>
<li>SafeArray.h</li>
</ul>
<pre>#include "ArrayIndexOutOfBoundsException.h"<br><br>template <class CType><br>class SafeArray { <br>public: <br> // 建构函式 <br> SafeArray(int); <br> // 解构函式 <br> ~SafeArray();<br> <br> CType get(int); <br> void set(int, CType);<br> <br> int length;<br>private:<br> CType *_array; <br><br> bool isSafe(int i); <br>};<br><br>// 动态配置阵列<br>template <class CType><br>SafeArray<CType>::SafeArray(int len) {<br> length = len;<br> _array = new CType[length];<br>}<br><br>// 测试是否超出阵列长度<br>template <class CType><br>bool SafeArray<CType>::isSafe(int i) {<br> // <br> if(i >= length || i < 0) {<br> return false;<br> } <br> else {<br> return true;<br> }<br>}<br><br>// 取得阵列元素值<br>template <class CType><br>CType SafeArray<CType>::get(int i) {<br> if(isSafe(i)) {<br> return _array[i]; <br> }<br> else {<br> // 存取超过阵列长度,丢出例外 <br> throw ArrayIndexOutOfBoundsException(i); <br> }<br>}<br><br>// 设定阵列元素值<br>template <class CType><br>void SafeArray<CType>::set(int i, CType value) {<br> if(isSafe(i)) {<br> _array[i] = value;<br> }<br> else {<br> // 存取超过阵列长度,丢出例外<br> throw ArrayIndexOutOfBoundsException(i); <br> }<br>}<br><br>// 删除动态配置的资源<br>template <class CType><br>SafeArray<CType>::~SafeArray() {<br> delete [] _array;<br>}</pre>
<br>
您还需要<a href="CustomExceptionClass.html">自订例外类别</a> 中的Exception与ArrayIndexOutOfBoundsException类别,一个使用SafeArray类别范本的例子如下:<br>
<ul>
<li>main.cpp</li>
</ul>
<pre>#include <iostream> <br>#include "SafeArray.h"<br>#include "Exception.h"<br>#include "ArrayIndexOutOfBoundsException.h"<br>using namespace std; <br><br>int main() {<br> SafeArray<int> safeArray1(10);<br> SafeArray<double> safeArray2(10);<br> <br> try {<br> for(int i = 0; i < safeArray1.length; i++) {<br> safeArray1.set(i, (i + 1) * 10);<br> }<br> <br> for(int i = 0; i < safeArray1.length; i++) {<br> cout << safeArray1.get(i) << " ";<br> }<br><br> cout << endl;<br><br> for(int i = 0; i < safeArray2.length; i++) {<br> safeArray2.set(i, (i + 1) * 0.1);<br> }<br> <br> for(int i = 0; i < safeArray2.length; i++) {<br> cout << safeArray2.get(i) << " ";<br> }<br> <br> cout << endl;<br> }<br> catch(ArrayIndexOutOfBoundsException e) {<br> cout << endl<br> << e.message()<br> << endl;<br> }<br> catch(Exception e) {<br> cout << endl<br> << e.message()<br> << endl;<br> }<br> <br> return 0; <br>} </pre>
<span class="postbody"><br>
执行结果:</span><br>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">10 20 30 40 50 60 70 80 90 100<br>
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1</span></small><span style="color: rgb(255, 255, 255);"><br>
</span></td>
</tr>
</tbody>
</table>
<br>
在这个例子中,您可以分别建立一个物件内部成员为int与double型态的SafeArray实例,但不用为它们个别撰写不同的类别,这可以让我们所定义的类别更具有通用性。 <br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -