一個簡單的類模板的友元函數和友元類示例
類模版 (class template)說明的是該類是一個模版,它代表的是整個類家族的參數化描述。
模版類 (template class)通常被用於下面幾個方面:
(1)作為類模版的同義詞
(2)從模版產生類
(3)具有一個template-id名稱的類。(template-id指的是模版名稱與緊隨其后的尖括號內部的所有實參的組合)
第二個和第三個含義區別是很細微的,它們的這些區別無關緊要。
通常使用的是 類模版。就像常使用 函數模版,而不是模版函數。
方式一:
#include <iostream> template <typename T> class myclass { public: myclass(T t1, T t2): x(t1), y(t2) { } template <typename Q> friend void print(myclass<Q> & my); template <typename Q> friend myclass<Q> * operator +(const myclass<Q> &my1, const myclass<Q> &my2); template <typename Q> friend class runclass; private: T x; T y; }; template <typename Q> void print(myclass<Q> & my) { std::cout << "x: " << my.x << " y: " << my.y << std::endl; } template <typename Q> myclass<Q> * operator +(const myclass<Q> &my1, const myclass<Q> &my2) { myclass<Q> *p = new myclass<Q>(my1.x+my2.x, my1.y+my2.y); return p; } template <typename Q> class runclass { public: runclass(Q i): sum(i) { } void calcSum(const myclass<Q> &my) { sum += my.x + my.y; } void cleanSum() { sum = 0; } void printSum() { std::cout << "sum: " << sum << std::endl; } private: Q sum; }; int main() { myclass<int> my1(19,29); print(my1); myclass<int> my2(30,90); print(my2); myclass<int> *pclass = my1 + my2; print(*pclass); delete pclass; runclass<int> run1(0); run1.calcSum(my1); run1.calcSum(my2); run1.printSum(); run1.cleanSum(); run1.printSum(); system("pause"); return 0; }
執行結果:
方式二:
#include <iostream> // 改動一:增加函數模板的聲明——而這又需要先聲明類模板 template <typename T> class myclass; template <typename T> void print(myclass<T> & my); template <typename T> myclass<T> * operator +(const myclass<T> &my1, const myclass<T> &my2); template <typename T> class runclass; template <typename T> class myclass { public: myclass(T t1, T t2): x(t1), y(t2) { } // 改動二:在函數名后面加上<>,指明它是之前聲明的函數模板的實例 friend void print<T>(myclass<T> & my); friend myclass<T> * operator +<T>(const myclass<T> &my1, const myclass<T> &my2); friend class runclass<T>; private: T x; T y; }; template <typename T> void print(myclass<T> & my) { std::cout << "x: " << my.x << " y: " << my.y << std::endl; } template <typename T> myclass<T> * operator +(const myclass<T> &my1, const myclass<T> &my2) { myclass<T> *p = new myclass<T>(my1.x+my2.x, my1.y+my2.y); return p; } template <typename T> class runclass { public: runclass(T i): sum(i) { } void calcSum(const myclass<T> &my) { sum += my.x + my.y; } void cleanSum() { sum = 0; } void printSum() { std::cout << "sum: " << sum << std::endl; } private: T sum; }; int main() { myclass<int> my1(19,29); print(my1); myclass<int> my2(30,90); print(my2); myclass<int> *pclass = my1 + my2; print(*pclass); delete pclass; runclass<int> run1(0); run1.calcSum(my1); run1.calcSum(my2); run1.printSum(); run1.cleanSum(); run1.printSum(); system("pause"); return 0; }
執行結果: