樣版
本章重點 13-1 樣板 13-2 樣板類別成員 13-3 樣板實戰
13-1 樣板 樣版 樣版就如同一個模子,從現實的角度來看,我們將石膏與水混合後,在加入模子中,它就能印出特定的形狀出來,而在樣版的觀念裡,石膏與水是資料型態,產生出來的成品則是類別或函數。 石膏 水 樣版
樣版函數 template <class 樣版參數> 回傳資料的型態 函數名稱(參數,…) { . }
資料交換樣版 template <class X> void Max_and_Min(X i,X j) { if (i>j) cout<<"Max is "<<i<<". Min is "<<j<<"\n"; else cout<<"Max is "<<j<<". Min is "<<i<<"\n"; }
樣版類別 1 class A 2 { 3 protected: 4 int x; 5 public: 6 A(int y){x=y;} 2 { 3 protected: 4 int x; 5 public: 6 A(int y){x=y;} 7 void show() 8 { 9 cout<<"x: "<<x<<"\n"; 10 } 11 };
宣告類別變數 類別名稱<資料型態>物件名稱(參數);
1 void main() 2 { 3 int xy = 10; 4 A<int> aa(10); 5 aa.show(); 6 7 char pp = 'a'; 8 A<char> bb(pp); 9 bb.show(); 10 }
13-2 樣板類別成員 鏈結串列就是將每一個單位的資料串連起來,而型成一個大型的資料庫,鏈結串列的資料可以從第一個新增刪除、最後一個新增刪除以及從中間新增刪除,非常符合資料處理的原則。
鏈結串列 1 1 2 N-1 N ………………………. 指向 指向 指向
鏈結串列中間插入一筆資料 P 1 2 N-1 N ………………………. P 1
樣版類別示範 1 template <class T> 2 class A 3 { 4 private: 5 T data; 3 { 4 private: 5 T data; 6 static A* a_head; 7 static A* a_now; 8 A* a_next; 9 public: 10 A() {a_head=a_now=this;a_next=NULL;} 11 A(T node_data):data(node_data),a_next(NULL){} 12 void add(T new_data); 13 void show(); 14 };
樣版類別成員的定義 template<class 參數型態> class 類別名稱 {…};
樣版類別標頭檔(1) 1 #ifndef _A 2 #define _A 3 4 template <class X> 3 4 template <class X> 5 class B; 6 7 template <class X> 8 void show_x(X t); 9 10 template <class X> 11 class A 12 { 13 public: 14 X i; 15 A(){} 16 friend class B<X>; 17 friend void show_x(X t1); 18 }; 19 20 #endif
樣版類別標頭檔(2) 1 #ifndef _H 2 #define _H 3 4 template <class X> 3 4 template <class X> 5 class A; 6 7 template <class X> 8 class B 9 { 10 A<X> aa; 11 public: 12 B(X tz){aa.i=tz;} 13 void show_z() 14 { 15 cout<<"B is A's friend. And A's i is "<<aa.i<<"\n"; 16 } 17 }; 18 19 20 template <class X> 21 void show_x(X t1) 22 { 23 A<X> aa; 24 aa.i = t1; 25 cout<<"show_x function is A's friend. And A's i is "<<aa.i<<"\n"; 26 } 27 28 #endif
朋友樣版類別示範 1 #include <iostream.h> 2 #include "ch13_7_1.h" 4 5 void main() 6 { 7 B<int> bb(10); 8 bb.show_z(); 9 10 show_x(12.8f); 11 }
13-3 樣版實戰 1 template<class T> 2 void A<T>::inadd(int index,T new_data) 3 { 4 int i=0; 5 a_now = a_head->a_next; 6 while (i<index && a_now!=NULL) 7 { 8 a_now = a_now->a_next; 9 i++; 10 } 11 12 if (a_now!=NULL) 13 { 14 A *temp_data = new A(0); 15 temp_data = a_now->a_next; 16 a_now->a_next = new A(new_data); 17 a_now = a_now->a_next; 18 a_now->a_next = temp_data; 19 } 20 }
從最前面插入,如下列程式碼所示: 1 template<class T> 2 void A<T>::headadd(T new_data) 3 { 4 A * new_node = new A(new_data); 5 A *temp_data = a_head->a_next; 6 a_head->a_next = new_node; 7 a_head->a_next->a_next = temp_data; 8 }
函數成員是用來處理資料可以從鏈結串列中間插入