天天看點

類模闆使用說明

類模闆聲明

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>//通常形式</code>

<code>template</code> <code>&lt;</code><code>typename</code> <code>TypeParam&gt;</code>

<code>class</code> <code>SomeClass</code>

<code>{</code>

<code>    </code><code>//...SomeClass的成員</code>

<code>};</code>

<code>//或者</code>

<code>template</code> <code>&lt;</code><code>typename</code> <code>TypeParam1,...,</code><code>typename</code> <code>TypeParamn&gt;</code>

   在這些形式中,TypeParam是命名将要存儲在容器類SomeClass中的資料的類型的通用類型參數,而關鍵詞typename可以被替換為class。

   注意

        ??1.關鍵詞template規定了後面接着的是一個類的模式,而不是一個實際的類聲明

    ?    ?2.在類型形參清單中關鍵詞tpyename和class可以互換使用

    ?    ?3.和規則類的函數成員不同,在使用類模闆時,編譯器必須能夠找到他的函數成員的定義。一種通常的方法是将所有函數定義從實作檔案ClassName.cpp中移到ClassName.h中類聲明後面。另一種方法是将函數定義放在單獨的檔案中然後再ClassName.h的最後#include這個檔案。

    ?    ?一個類模闆僅僅是描述如何根據給定的類型那個建構不同的類的一個模式,這個建立一個類的過程被稱為執行個體化。這是通過附加一個實際類型到對象定義中的類名上來實作的:

<code>SomeClass&lt;Actual_Type&gt; object;</code>

    ?    ?例如,可以使用下面的定義來執行個體化Stack這個類模闆:

<code>Stack&lt;</code><code>char</code><code>&gt; charStack;</code>

<code>Stack&lt;</code><code>char</code><code>&gt; dubStack;</code>

    ?    ?當編譯器處理這些聲明時,他将産生兩個不同的Stack類(兩個執行個體),一個是使用char代替了StackElement,另一個是使用double代替了StackElement。第一個類中的構造函數将構造charStack為一個空的字元型的棧,而第二個類中的構造函數将構造dubStack為一個空的double型的棧。

有3條重要的規則規定了如何建立類模闆:

    ?    ?1.所有定義在類聲明之外的操作都必須是模闆函數

    ?    ?2.任何将一個模闆類的名作為類型的使用都必須參數化

    ?    ?3.當使用類模闆時,編譯器必須能夠找到它的操作的定義

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<code>template</code> <code>&lt;</code><code>typename</code> <code>StackElement&gt;</code>

<code>class</code> <code>Stack</code>

<code>    </code><code>//複制構造函數</code>

<code>    </code><code>Stack(</code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; original);</code>

<code>    </code><code>//指派運算符</code>

<code>    </code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; operator=(</code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; original);</code>

<code>    </code><code>//somecode</code>

<code>Stack&lt;StackElement&gt;::Stack()</code>

<code>    </code><code>// 構造函數的定義</code>

<code>}</code>

<code>Stack&lt;StackElement&gt;::Stack(</code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; original)</code>

<code>//---operator&lt;&lt;()</code>

<code>inline</code> <code>ostream&amp; operator&lt;&lt;(ostream&amp; out,</code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; st)</code>

一個Stack類模闆

<code>#include &lt;iostream&gt;</code>

<code>#include &lt;cassert&gt;</code>

<code>using</code> <code>namespace</code> <code>std;</code>

<code>#ifndef DSTACK</code>

<code>#define DSTACK</code>

<code>public</code><code>:</code>

<code>    </code><code>Stack(</code><code>int</code> <code>numElements = 128);</code>

<code>    </code><code>~Stack();</code>

<code>    </code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; operator =(</code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; rightHandSide);</code>

<code>    </code><code>bool</code> <code>empty() </code><code>const</code><code>;</code>

<code>    </code><code>void</code> <code>push(</code><code>const</code> <code>StackElement&amp; value);</code>

<code>    </code><code>void</code> <code>display(ostream&amp; out) </code><code>const</code><code>;</code>

<code>    </code><code>StackElement top() </code><code>const</code><code>;</code>

<code>    </code><code>void</code> <code>pop();</code>

<code>private</code><code>:</code>

<code>    </code><code>int</code> <code>myCapacity;</code>

<code>    </code><code>int</code> <code>myTop;</code>

<code>    </code><code>StackElement* myArray;</code>

對應的cpp檔案

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

<code>#include &lt;new&gt;</code>

<code>Stack&lt;StackElement&gt;::Stack(</code><code>int</code> <code>numElements)</code>

<code>    </code><code>assert</code><code>(numElements&gt;0);</code>

<code>    </code><code>myCapacity = numElements;</code>

<code>    </code><code>myArray = </code><code>new</code><code>(</code><code>nothrow</code><code>) StackElement[myCapacity];</code>

<code>    </code><code>if</code><code>(myArray != 0)</code>

<code>        </code><code>myTop = -1;</code>

<code>    </code><code>else</code>

<code>    </code><code>{</code>

<code>        </code><code>cerr &lt;&lt; </code><code>"Inadequate memort to allocate stack !\n"</code> <code>&lt;&lt; </code><code>" -- terminating execution !\n"</code><code>;</code>

<code>        </code><code>exit</code><code>(1);</code>

<code>    </code><code>}</code>

<code>Stack&lt;StackElement&gt;::Stack(</code><code>const</code> <code>Stack&lt;StackElement&gt; &amp;original):myCapacity(original.myCapacity),myTop(original.myTop)</code>

<code>        </code><code>for</code><code>(</code><code>int</code> <code>pos=0;pos&lt;=myTop;pos++)</code>

<code>            </code><code>myArray[pos] = original.myArray[pos];</code>

<code>        </code><code>cerr &lt;&lt; </code><code>"Inadequate memort to allocate stack !\n"</code><code>;</code>

<code>inline</code> <code>Stack&lt;StackElement&gt;::~Stack()</code>

<code>    </code><code>delete</code><code>[] myArray;</code>

<code>const</code> <code>Stack&lt;StackElement&gt;&amp; Stack&lt;StackElement&gt;::operator =(</code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; rightHandSide)</code>

<code>    </code><code>if</code><code>(</code><code>this</code> <code>!= &amp;rightHandSide)</code>

<code>        </code><code>if</code><code>(myCapacity != rightHandSide.myCapacity)</code>

<code>        </code><code>{</code>

<code>            </code><code>delete</code><code>[] myArray;</code>

<code>            </code><code>myCapacity = rightHandSide.myCapacity;</code>

<code>            </code><code>myArray = </code><code>new</code> <code>StackElement[myCapacity];</code>

<code>            </code><code>if</code><code>(myArray == 0)</code>

<code>            </code><code>{</code>

<code>                </code><code>cerr &lt;&lt; </code><code>"Inadequate memory !\n"</code><code>;</code>

<code>                </code><code>exit</code><code>(1);</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

<code>        </code><code>myTop = rightHandSide.myTop;</code>

<code>            </code><code>myArray[pos] = rightHandSide.myArray[pos];</code>

<code>    </code><code>return</code> <code>*</code><code>this</code><code>;</code>

<code>inline</code> <code>bool</code> <code>Stack&lt;StackElement&gt;::empty() </code><code>const</code>

<code>    </code><code>return</code> <code>(myTop == -1);</code>

<code>inline</code> <code>void</code> <code>Stack&lt;StackElement&gt;::push(</code><code>const</code> <code>StackElement &amp;value)</code>

<code>    </code><code>if</code><code>(myTop &lt; myCapacity-1)</code>

<code>        </code><code>++myTop;</code>

<code>        </code><code>myArray[myTop] = value;</code>

<code>        </code><code>cerr &lt;&lt; </code><code>"Stack full, can‘t add new value‘ !\n"</code><code>;</code>

<code>inline</code> <code>void</code> <code>Stack&lt;StackElement&gt;::display(ostream &amp;out) </code><code>const</code>

<code>    </code><code>for</code><code>(</code><code>int</code> <code>i=myTop;i&gt;=0;i--)</code>

<code>        </code><code>out &lt;&lt; myArray[i] &lt;&lt; endl;</code>

<code>inline</code> <code>ostream&amp; operator &lt;&lt;(ostream&amp; out,</code><code>const</code> <code>Stack&lt;StackElement&gt;&amp; st)</code>

<code>    </code><code>st.display(out);</code>

<code>    </code><code>return</code> <code>out;</code>

<code>inline</code> <code>StackElement Stack&lt;StackElement&gt;::top() </code><code>const</code>

<code>    </code><code>if</code><code>(!empty())</code>

<code>        </code><code>return</code> <code>(myArray[myTop]);</code>

<code>        </code><code>cerr &lt;&lt; </code><code>"Stack is empty -- returning garbage value\n"</code><code>;</code>

<code>        </code><code>StackElement garbage;</code>

<code>        </code><code>return</code> <code>garbage;</code>

<code>inline</code> <code>void</code> <code>Stack&lt;StackElement&gt;::pop()</code>

<code>    </code><code>if</code><code>(myTop &gt;= 0)</code>

<code>        </code><code>myTop--;</code>

<code>        </code><code>cerr &lt;&lt; </code><code>"Stack is empty -- can‘t remove a value\n"</code><code>;</code>

?