⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classtemplate.html

📁 关于 C++ 的历史无须我来介绍了
💻 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 &lt;class 型态名称&gt; </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;">&nbsp;&nbsp;&nbsp; // ........ </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>

在类别定义外部定义的样版函式(在::之前加上&lt;型态名称&gt;),以及如何使用样版类别建立物件,这边直接使用实例来介绍:<br>


<ul>

  <li>SafeArray.h</li>

</ul>


<pre>#include "ArrayIndexOutOfBoundsException.h"<br><br>template &lt;class CType&gt;<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 &lt;class CType&gt;<br>SafeArray&lt;CType&gt;::SafeArray(int len) {<br>    length = len;<br>    _array = new CType[length];<br>}<br><br>// 测试是否超出阵列长度<br>template &lt;class CType&gt;<br>bool SafeArray&lt;CType&gt;::isSafe(int i) {<br>    // <br>    if(i &gt;= length || i &lt; 0) {<br>         return false;<br>    } <br>    else {<br>         return true;<br>    }<br>}<br><br>// 取得阵列元素值<br>template &lt;class CType&gt;<br>CType SafeArray&lt;CType&gt;::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 &lt;class CType&gt;<br>void SafeArray&lt;CType&gt;::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 &lt;class CType&gt;<br>SafeArray&lt;CType&gt;::~SafeArray() {<br>    delete [] _array;<br>}</pre>


<br>

您还需要<a href="CustomExceptionClass.html">自订例外类别</a> 中的Exception与ArrayIndexOutOfBoundsException类别,一个使用SafeArray类别范本的例子如下:<br>

<ul>

  <li>main.cpp</li>

</ul>


<pre>#include &lt;iostream&gt; <br>#include "SafeArray.h"<br>#include "Exception.h"<br>#include "ArrayIndexOutOfBoundsException.h"<br>using namespace std; <br><br>int main() {<br>    SafeArray&lt;int&gt; safeArray1(10);<br>    SafeArray&lt;double&gt; safeArray2(10);<br>    <br>    try {<br>        for(int i = 0; i &lt; safeArray1.length; i++) {<br>            safeArray1.set(i, (i + 1) * 10);<br>        }<br>    <br>        for(int i = 0; i &lt; safeArray1.length; i++) {<br>            cout &lt;&lt; safeArray1.get(i) &lt;&lt; " ";<br>        }<br><br>        cout &lt;&lt; endl;<br><br>        for(int i = 0; i &lt; safeArray2.length; i++) {<br>            safeArray2.set(i, (i + 1) * 0.1);<br>        }<br>    <br>        for(int i = 0; i &lt; safeArray2.length; i++) {<br>            cout &lt;&lt; safeArray2.get(i) &lt;&lt; " ";<br>        }<br>    <br>        cout &lt;&lt; endl;<br>    }<br>    catch(ArrayIndexOutOfBoundsException e) {<br>        cout &lt;&lt; endl<br>             &lt;&lt; e.message()<br>             &lt;&lt; endl;<br>    }<br>    catch(Exception e) {<br>        cout &lt;&lt; endl<br>             &lt;&lt; e.message()<br>             &lt;&lt; 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 + -