樣板類別:有些類別,其類別成員也是個類別物件,但其具體的型態是在建構時才能確定的。我們可以先宣告樣板參數型別,然後利用此樣板參數型別宣告類別成員的資料形態。範例如下:
class jewelry // 建立一類別jewelry
{
public:
int price;
string kind;
jewelry(){} //類別jewelry的備用建構式
jewelry(string kind_,int price_)
{kind=kind_;price=price_;}
};
class car // 建立一類別car
{
public:
int price;
string kind;
car(){} //類別car的備用建構式
car(string kind_,int price_)
{kind=kind_;price=price_;}
};
class art // 建立一類別art
{
public:
int price;
string kind;
art(){} //類別art的備用建構式
art(string kind_,int price_)
{kind=kind_;price=price_;}
};
template <class Q> //宣告樣板參數型別Q
class person //建立樣板類別person
{
public:
string name;
Q item; //不定型別的類別成員,可以是jewelry, car或是art
person(string name_,Q item_){name=name_;item=item_;}
void get_item()
{cout<<name<<" have a "<<item.kind<<" worth "<<item.price<<endl;}
};
int main() //主程式在此
{
jewelry j1("ruby",500);
car c1("ford",600);
art a1("paint",700);
person<art> person1("thurmo",a1); //建構樣板類別物件:樣板類別名稱<欲指定的樣板參數型別> 樣板類別物件名稱 建構式
person1.get_item(); //顯示:thurmo have a paint worth 700
}
註一:以上例而言,若欲指定的樣板參數型別是個類別,則該類別一定要有備用建構式。否則會造成編譯錯誤。
註二:若某一類別是樣板類別,則要做一函式,其輸入參數是此樣板類別物件,則此函式的寫法應該是(以上例來看):
template <class Q>
void print_name(person<Q> p){cout<<p.name;} //函式當然應該定義在主程式之外
也就是說,在函式宣告之前應先宣告樣板參數型別,而類別名稱後也該加入樣板參數型別。
留言列表