Thứ Bảy, 26 tháng 12, 2009

// // Leave a Comment

Hàm chung và lớp chung C++


Hàm chung là hàm thực hiện một chức năng nào đó với các kiểu dữ liệu khác nhau do đối số của hàm và kiểu của hàm.

Để tạo một hàm chung chúng ta sử dụng từ khoá template với cú pháp như sau:

template<class TType> Kiểu_hàm tên_hàm(các đối số){

// Các câu lệnh

}

Trong đó TType là một kiểu dữ liệu hình thức và nó được sử dụng trong hàm và các đối của hàm.Hàm chung cũng có thể sử dụng nhiều kiểu dữ liệu chung với cú pháp khai báo như sau:

template <class TType, TType2,.., TTypen> Kiểu_hàm tên_hàm(các đối số){

// Các câu lệnh

}

hàm chung hạn chế hơn hàn quá tải bởi nó chỉ thực hiện đựơc một công việc trên các kiểu dữ liệu khác nhau, trong khi hàm quá tải có thể thực hiện nhiều nhiệm vụ trên nhiều kiểu dữ liệu khác nhau. Cùng với việc tạo ra hàm chung, C++ cũng tạo ra Lớp chung. Lớp chung định nghĩa tất cả các thuật toán được dùng bới lớp đó với các kiểu dữ liệu mà nó sẽ xử lý được định nghĩa rõ dưới dạng tham số lúc tạo ra đối tượng thuộc lớp chung đó!

Dạng tổng quát để khai báo một lớp chung

template <class TType> class tên_lớp{

// Các thành phần của lớp


}

khi muốn cài đặt một hàm nào đó trong lớp chung chúng ta viết như sau:

template <class TType>tên_lớp<TType>::tên_hàm(các_đôi_số)

ví dụ có một lớp stack là lớp chung cho các lớp khác như trong VD sau:

#include<iostream.h>

template<class StackType>class CStack{

StackType ds[100];

—-int pos;
—-
int size;

public:

—-CStack(int n){size=n; pos=0;}

—-void Push(StackType);

—-StackType Pop();

};

template<class StackType> void CStack<StackType>::Push(StackType ch){

—-if (pos==size){

—-—-cout<<”\n Stack full”;

—-—-return;
—-
}

—-ds[pos]=ch;

—-pos++;

}

template<class StackType> StackType CStack<StackType>::Pop(){

—-if (pos==0){

—-—-cout<<”\n Stack empty”;

—-—-return 0;

—-}


—-pos–;

—-return ds[pos];

}

void main(){

—-CStack<int> s1(10);

—-CStack<char> s2(10);

—-for (int i=0; i<10; i++){

—-s1.Push(i);

—-s2.Push(‘a’+i);

—-}

—-cout<<”\n Stack Int: “;

—-for(i=0; i<10; i++)

—-—-cout<<s1.Pop();

—-cout<<”\n Stack Char: “;

—-for(i=0; i<10; i++)

—-—-cout<<s2.Pop();

—-cin.get();

}

Một lớp chung có thể chứa nhiều kiểu dữ liệu chung. Khi đó các tên kiểu dữ liệu chung được khai báo trong phần template<class …..> mỗi kiểu cách nhau bằng dấu ,.

Cú pháp khai báo như sau:

template <class TType1, TType2,…., TTypen> class tên_lớp{

// Các thành phần của lớp

}

ví dụ như sau:

#include<iostream>

using namespace std;


template<class Type1, Type2> class myclass{

-Type1 x;

-Type2 y;

public:
-myclass(Type1 a, Type2 a){x=a; y=b;}

-void show(){cout<<x<<” “<<y;}

};

void main(){

-myclass<int, float>ob1(10,2.78);
-myclass<int, char*>ob2(10,”Le Van A”);

-ob1.show();

-ob2.show();

-cin.get();

}

0 comments: