Merhaba,
Eksik gördüğüm ve/veya bana yöneltilen sorulara bağlı kalarak makale hazırlamaya çalışıyorum.
Bu makalede işleyeceğimiz konu da bunlardan biridir.
Cpp'nin en önemli özelliklerinden biri de Template kavramıdır.
Template kelime anlamı taslak-şablon dur. Cpp'da Template kavram "Java Generics" ile aynıdır.
Class ve fonksiyon tasarlarken,farklı nesneler ve/veya farklı veri türlerinden oluşan birden fazla
Class ve fonksiyon tasarlamak yerine Template yapısı kullanılır.
Böylece tek bir kalıp üzerinden farklı nesne ve veri türü/tipi işletmek mümkün hale gelir.
Cpp'da kullanılan şablonlar ikiye ayrılır.
1.Fonksiyon şablonları(Function Templates)
2.Class Şablonları(Class Template)
Tanımlama şekilleri aşağıdaki gibidir.
Fonksiyon için:
template<typename Tip>
CCpp'de tip tanımlamaya aşinaysanız bu kalıb size yabancı gelmeyecektir.
Sonuç olarak burada bir tip tanımlaması var. Dolayısıyla dinamik değişen bir tip tanımlaması yapmış oluyoruz.
Class için:
template<class CTip>
Aşağıda tanımlı ve mutlak değerleri belli olan fonksiyonları inceleyelim:
#include <iostream>
using namespace std;
void func_int(int _iv)
{
cout << "func_int:" << _iv << "\n";
}
void func_double(double _dv)
{
cout << "func_double:" << _dv << "\n";
}
void func_bool(bool _bv)
{
cout << "func_bool:" << _bv << "\n";
}
int main()
{
func_int(44);
func_double(44.4);
func_bool(true);
return 0;
}
Yukarıda farklı veri türlerinden parametre alan birkaç fonksiyon geliştirilmiştir.
Dolayısıyla veri türü arttıkça fonksiyon sayıları da artacaktır.Bu da bir bakıma uygulama boyutunu ve
okunabilirliği ve hata denetlemeyi zorlaştıracaktır.
Buna karşın aşağıda verilen örneği inceleyelim:
template<typename T>/*template uygulanacak fonksiyon ve/veya class,template ile arsında boş satır bulunamaz.*/
void func_template(T _t)
{
cout << "func_template:" << _t << "\n";
}
//geri değer döndüren template fonksiyon:
template<typename T>
T func_return(T _t)
{
return _t;
}
int main()
{
func_template(44);
func_template(44.4);
func_template(true);
func_template('A');
func_template("merhaba");
//
cout << "func_return:" << func_return("kerim firat\n");
cout << "func_return:" << func_return(1225555);
return 0;
}
Yukarıda verilen örnekte beş farklı veri tip için ortak kullanılan bir template oluşturulmuştur.
Dolayısıyla hangi veri tipi giderse gitsin,anında dinamik olarak template konum alacaktır.
Aşağıda template dizi örneğine yer verilmiştir.
template<typename T>
void func_template(T tarray[])
{
for(int i=0;i<5;i++)
{
cout <<tarray[i] << "\n";
}
cout << "\n";
}
int main()
{
int int_array[] = {10,30,20,50,90};
char chr_array[] = {'A','a','B','b','C','c'};
func_template(int_array);
func_template(chr_array);
return 0;
}
Template yapısını Class ile kullanmak pek farklı değildir.
Aşağıda verilen ilk örnekte standart bir Class yapısı verilmiştir.İkinci örnekte ise
template kullanılmıştır.
1.Örnek:
Bu örnek uygulamada tasarlanmış Item Class'ı sadece int türden veri kabul ediyor.
Şayet daha fazla veri tipleriyle çalışmak istersek,bu durumda ilgili veri tipleri için fonksiyon geliştirmek
gerekir.
class Item
{
private:
int value;
public:
Item():value(0)
{
}
void setItem(int _value)
{
value = _value;
}
int getItem() const
{
return value;
}
};
int main()
{
Item item;
item.setItem(44);
int value = item.getItem();
cout << value;
return 0;
}
2.Örnek:
#include <iostream>
#include <string>
using namespace std;
template<class T>
class Item
{
private:
T value;
public:
Item():value(T())
{
}
void setItem(T _value)
{
value = _value;
}
T getItem() const
{
return value;
}
};
int main()
{
//nesne tanımlarken veri tipi/türü belirleniyor:
Item<int> item; //int
item.setItem(44);
cout << item.getItem() << "\n";
//
Item<string> item2; //string
item2.setItem("Merhaba");
cout << item2.getItem() << "\n";
return 0;
}
İyi Çalışmalar.
Hiç yorum yok:
Yorum Gönder