C Gömülü Programlama konularımız yayında...
Şablon sınıflar oluşturmak için, bir sınıf içinde kullanılan değişkenlerin en az bir tanesini veri türü değişken parametre olarak tanımlamak gerekir. Veri türü değişken parametreleri sınıf içindeki fonksiyonlarda aynı kodlarla kullanabilir.
Şablon sınıftan bir nesne oluşturulurken, sınıfa parametre olarak geçirilecek değişkenlerin veri türü belirlenir.
Bir sınıf şablonları, farklı veri türlerine aynı kodlarla işlem yapılmasına olanak sağladığından, büyük kolaylık sağlar.
Bir sınıf şablonu da fonksiyon şablonu gibi template ve typename anahtar kelimeleri ile oluşturulur. Sınıf şablonu bildirimi için kullanılan genel yapı aşağıda gösterilmektedir:
template <typename T> class sınıf-adı { // Sınıf içi değişken ve fonksiyon bildirimleri }
Sınıf şablon bildiriminde typename yerine class anahtar kelimesi de kullanılabilir. Her iki anahtar kelime de aynı işlemi yapar.
Burada T ifadesi, sınıf tarafından kullanılan bir veri türü için bir yer tutucu adını gösterir. Bu isim, sınıf bildiriminde en az bir adet olmak üzere kullanılır. Şablon sınıftan bir nesne oluşturulurken veri türü belirlendiğinden, derleyici sınıfın kopyasını bu veri türüne göre oluşturur.
Şablon sınıfının bildirimi yapıldıktan sonra, aşağıdaki şekilde nesne oluşturulur:
// Tek veri türü ile parametre geçirilen sınıf bildirimi sınıf-adı <T> nesne_adı; // Çoklu veri türü ile parametre geçirilen sınıf bildirimi sınıf-adı <T1, T2, ...> nesne_adı;
Şablon sınıf bildiriminde sadece tek parametre kullandığımızda, şablon sınıftan her nesne üretilmesinde sadece tek bir veri türü tanımlanır. Sınıf kopyası içinde sadece bu veri türü değişken olarak kullanılabilir.
Aynı veri türünden private, protected ve public değişkenlere işlem yapan fonksiyonlar içeren bir şablon sınıfının kullanılmasını bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
template <typename t> class sinif {
private:
t priid;
protected:
t proid;
public:
t pubid;
void deger_ata(t pid1, t pid2, t pid3)
{
priid = pid1; proid = pid2; pubid = pid3;
cout << "sinif değişkenlerine değer atama: " << priid << " " << proid << " " << pubid << endl;
}
void deger_goster()
{
cout << "sinif değişken değerleri: " << priid << " " << proid << " " << pubid << endl;
}
};
int main(void)
{
sinif <int> nes1;
nes1.deger_ata(121, 745, 1059);
nes1.deger_goster();
sinif <float> nes2;
nes2.deger_ata(72.21f, 1084.47f, 1273.85f);
nes2.deger_goster();
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
sinif değişkenlerine değer atama: 121 745 1059 sinif değişken değerleri: 121 745 1059 sinif değişkenlerine değer atama: 72.21 1084.47 1273.85 sinif değişken değerleri: 72.21 1084.47 1273.85
Program, önce tek bir veri türünün parametre olarak geçirildiği bir sınıf tanımlar. Tanımladığı sinif türünden nes1 nesnesini oluştururken int veri türünü parametre olarak sınıfa geçirir. Sınıf içindeki deger_ata() fonksiyonu ile tüm değişkenlere bir değer atar ve deger_goster() fonksiyonu ile değişken değerlerini ekrana yazar. Aynı işlemleri nes2 nesnesini tanımlarken float veri türü ile yapar.
Şablon sınıf bildiriminde birden fazla veri türü için parametre kullandığımızda, sınıf içinde birden fazla değişkenin veri türü nesne oluşturulması ile belirlenebilir.
İki farklı veri türünden private, protected ve public değişkenlere işlem yapan fonksiyonlar içeren bir şablon sınıfının kullanılmasını bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
template <typename t1, typename t2> class sinif {
private:
t1 priid1;
t2 priid2;
protected:
t1 proid1;
t2 proid2;
public:
t1 pubid1;
t2 pubid2;
void deger_ata(t1 pid1, t1 pid2, t1 pid3, t2 pid4, t2 pid5, t2 pid6)
{
priid1 = pid1; proid1 = pid2; pubid1 = pid3;
priid2 = pid4; proid2 = pid5; pubid2 = pid6;
}
void deger_goster()
{
cout << "sinif t1 değişken değerleri: " << priid1 << " " << proid1 << " " << pubid1 << endl;
cout << "sinif t2 değişken değerleri: " << priid2 << " " << proid2 << " " << pubid2 << endl;
}
};
int main(void)
{
sinif <int, int> nes1;
nes1.deger_ata(246, 526, 1254, 4315, 5873, 10951);
nes1.deger_goster();
cout << endl;
sinif <float, float> nes2;
nes2.deger_ata(841.12f, 1754.21f, 2482.95f, 321.85f, 9432.47f, 11544.21f);
nes2.deger_goster();
cout << endl;
sinif <int, float> nes3;
nes3.deger_ata(357, 9421, 44625, 742.13f, 1412.54f, 3475.24f);
nes3.deger_goster();
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
sinif t1 değişken değerleri: 246 526 1254 sinif t2 değişken değerleri: 4315 5873 10951 sinif t1 değişken değerleri: 841.12 1754.21 2482.95 sinif t2 değişken değerleri: 321.85 9432.47 11544.21 sinif t1 değişken değerleri: 357 9421 44625 sinif t2 değişken değerleri: 742.13 1412.54 3475.24
Program, önce iki farklı veri türünün parametre olarak geçirildiği bir sınıf tanımlar. Tanımladığı sinif türünden nes1 nesnesini oluştururken her iki parametre için de int veri türünü sınıfa geçirir. Sınıf içindeki deger_ata() fonksiyonu ile tüm değişkenlere bir değer atar ve deger_goster() fonksiyonu ile değişken değerlerini ekrana yazar. Aynı işlemleri nes2 nesnesini tanımlarken bu kez float veri türü ile yapar. Son olarak, nes2 nesnesini tanımlarken ilk veri türü olarak int ikinci veri türü olarak float değerleri sınıfa geçirir ve fonksiyonlarla değer atama ve ekrana yazdırma işlemlerini yapar.