[Advance] Class template

Trong bài function template giới thiệu cho ta cách xây dựng template cho các hàm. Với cách áp dụng template cho các hàm giúp ta xây dựng 1 hàm có thể sử dụng cho các kiểu dữ liệu khác nhau.

Trong bài viết này chúng ta sẽ cùng tìm hiểu về cách xây dựng template cho class.

Nếu các bạn đã từng sử dụng các lớp trong STL thì các bạn sẽ thấy được lợi ích của việc sử dụng template. Các lớp trong STL đều được xây dụng sử dụng template. Vì thế mà ta có thể sử dụng cho rất nhiều kiểu dữ liệu khác nhau.

Ví dụ:


//Khai báo biến vector có các phần tử kiểu int
std::vector<int> v_i;

//Khai báo biến vector có các phần tử kiểu float
std::vector<float> v_f;

//Khai báo biến vector có các phần tử kiểu Person
std::vector<Person> v_p;

Để định nghĩa class template ta sử dụng từ khóa template

template<class T1, class T2,...>
class ten_class
{
 //Các thành phần class
};

Trong đó

  • T1, T2 – đại diện cho kiểu dữ liệu, có thể đặt tên bất kỳ.

Ví dụ:


template<class T>
class CMath

{

private:

   T m_data;

public:

   CMath(T data)

   {

      m_data = data;

   }

   CMath<T>& operator+(CMath<T> math)

   {

      CMath<T> res(0);

      res.m_data = m_data + math.m_data;

      return res;

   }

   friend ostream& operator << (ostream& out, const CMath<T>& cmath)

   {

      out << cmath.m_data;

      return out;

   }

};

Để tạo đối tượng của class template

ten_class <kieu_du_lieu> ten_bien

Ví dụ:


int main()

{

   CMath<int> iMat1(5);

   CMath<int> iMat2(10);

   CMath<int> res = iMat1 + iMat2;

   cout << res;

   return 0;

}

Class template và friend function

Thông thường khi ta khai báo 1 class template thì các hàm thành phần của class đó cũng là function template, còn các friend function không phải là hàm thành phần của class nên không phải là function template.

Tuy nhiên nếu ta định nghĩa friend function đó bên trong class thì nó sẽ được tạo tự động khi mỗi thực thể của class được tao. Cũng có thể hiểu nó hoạt động như 1 template function.

Còn nếu ta định nghĩa hàm đó bên ngoài class thì ta sử dụng các cách sau.

C1 : Sử dụng kiểu dữ liệu xác định, và nó chỉ làm việc với kiểu dữ liệu xác định đó.


friend ostream& operator << (ostream& out, const CMath<int>& cmath)

{

   out << cmath.m_data;

   return out;

}

C2 : Định nghĩa friend function cũng là template function


template<class T>
class CMath

{

private:

   T m_data;

public:

   //Khai báo hàm bạn là template funtion
   template<class U>
   friend ostream& operator << (ostream& out, const CMath<U>& cmath);

};

template<class U>
ostream& operator << (ostream& out, const CMath<U>& cmath)

{

   out << cmath.m_data;

   return out;

}

Was this article helpful?