Wednesday

14

December

2016


0

YORUM


Compe 225 | C++ Ders 13 Chaining Nedir ?

7 ay önce yazıldı

c++,chaining,compe 225,ders notu,konu anlatım,kullanımı,örnekleri,davutkara(Obje methodlarına art arda ulaşma tekniği.)Classımızda bir toplama işlemi olduğunu varsayalım ve classımız şöyle olsun.

#include <iostream>
class Islem{
public:
int sayi = 0;	 
Islem(int n):sayi(n){}
void topla(int a){
sayi += a;
}
};
int main(void){
Islem objem(5); 
objem.topla(5);
objem.topla(3);
objem.topla(2);
std::cout << objem.sayi;
return 0;
}

Bu kodda gördüğünüz gibi objemizdeki sayi veriablını topla methodunu kullanarak sürekli artırıyoruz. Ancak bu görüntü çok hoş değil.

Bunun yerine chaning yaparak methodları art arda dizebiliriz yani;

objem.topla(5).topla(3).topla(7);

Başlangıçta objemizi yazıp daha sonra kullancağımız methodları(fonkisyon) ları art arda sıralıyoruz. Ancak burdaki chaning mantığını şu, ilk yazdığımız fonksiyon için yani topla(5) için sol tarafta bir obje varken. Topla(3) için sol tarafta bir function var, aynı şey topla(7) içinde geçerli, ancak biz topla functionından objemizi tekrar return edersek şöyle olacak,

Şimdi şuanki classı kullanarak yaparsak aşağıdaki gibi olacak çünkü topla methodunun return_type ı void,

chaining1

Dolayısıyla şuanki kodla bunu yapmak istersek hatalı, peki bizim yapmak istediğimiz şey nedir ?

chaining2

Dolayısyıla biz function daki return_type yerine void değilde, class ımızın adını yazarsak geriye bizim class ımız dnecektir. Ancak geri döndüreceğimiz değer classımızın kendisi değilde addresi olacağı için yanına birde & işareti koyacağız dolayısıyla kodumuz şu hale dönecek.

#include <iostream>
class Islem{
public:
int sayi = 0;
Islem(int n):sayi(n){}
Islem& topla(int a){
sayi += a;
return *this;
}
};
int main(void){
Islem objem(5); 
objem.topla(5).topla(3).topla(2);
std::cout << objem.sayi;
return 0;
}

Artık fonksiyonumuz objemizi tekrar döndürdüğü için sıradaki method objemizden yararlanabilecek.

Şimdi burda anlatmadığım şey ise this keywordu.

This keywordu : objemizi temsil eden bir pointer o yüzden zaman zaman karışıklık çıkmasın diye this kelimesini kullanıyoruz.

Ancak this keywordu sadece class içinde kullanılabiliyor, dışında kullanılamıyor. Ayrıca pointer konusundan hatırlarsak pointer bağlacı -> olduğu için mesela sayi veriable ına erişeceksek this->sayi; diyoruz buda normal şekilde sayi demekle aynı anlama geliyor. Sadece ilerde işler karıştırmaya bağladığında belirteç görevi için  kullanıyoruz.

Yukardaki örnekte & kullanarak objemizin adresini tekrar return ettik, ancak bildiğiniz üzere this bir pointer ve o da objemizi gösteriyor, eğer onu return etteysedik nasıl olurdu (bu kısım biraz trickli bir kısım o yüzden anlamazsanız önemli olan üstteki kullanım).

#include <iostream>
class Islem{
public:
int sayi = 0;
Islem(int n):sayi(n){}
Islem* topla(int a){
sayi += a;
return this;
}
};
int main(void){
Islem objem(5); 
objem.topla(5)->topla(3)->topla(2);
std::cout << objem.sayi;
return 0;
}

Burda ise return this yazıp, return type ınada Islem* , yıldız koyduk bu şekilde pointerı return ettik. Şimdi objeyi kullanarak objem.topla(5) i kullandık orası okey ama burdan bize obje değilde pointer döndüğü için artık bağlacımız -> işareti oluyor ve artık onu kullanıyoruz. Çok mantıklı bir şey değilde böylede bir şey var ama öneml bilgi ise şu tekrar edelim eğer pointer  bir objeyi gösteriyorsa içinde ki metoda nokta ile değil -> ile erişiriz.