PDA

Tam Sürümünü Görmek İçin : Algoritma kullanımı ve Operator Overloading


Darkstar
06/12/2004, 17:41
#include <iostream>
#include <stdlib>
#include <vcl.h>
#include <algorithm>
#include <vector>
using namespace std;


class Cat
{
public:
int x, y;
Cat(int a) { x = a; }

// sort algoritmasını kullanabilmek için gerekli
friend bool operator==(const Cat& left, const Cat& right);
friend bool operator<(const Cat& left, const Cat& right);

// standard < operatörü
bool operator<(const Cat& right)
{
cout<<"burda member olan op< kullanıldı\n";
return x < right.x;
}
};



bool operator==(const Cat& left, const Cat& right)
{
cout<<"friend op== cagırıldı\n";
return left.x == right.x ;
}

bool operator<(const Cat& left, const Cat& right)
{
cout<<"firend op< cagırıldı\n";
return (left.x < right.x) ;
}


int main(int argc, char* argv[])
{
vector<Cat> v;
vector<Cat>::iterator myiterator;

Cat kaplan(10);
Cat arslan(30);
Cat panter(30);
Cat pisicik(40);

v.push_back(kaplan);
v.push_back(arslan);
v.push_back(pisicik);
v.push_back(panter);

sort( v.begin(), v.end());

int i;
for(i=0;i<v.size();i++)
cout<<v[i].x<<endl;

if (kaplan < arslan)
cout<<"burda member olan op< kullanıldı\n";

getchar();
return 0;
}



Soru şu: Neden sort() algoritmasında "member op.<" kullanılmıyor da friend olarak harici tanımladığımız çift argumanlı op< kullanılıyor?


acehreli
07/12/2004, 08:45
Darkstar, uye olan < islecini 'const' yapmadigin icin o islev secilmiyor. O islevi soyle degistirmelisin (sonundaki 'const'a dikkatini cekerim):


bool operator<(const Cat& right) const
{
/* ... */
}


Olayin ozu su: sort isini yapmak icin karsilastirma islevi cagirirken, o isleve nesneleri 'const' olarak gonderir. sort'un icinde bir noktada soyle bir sozde kod oldugunu dusunebilirsin:


bool asil_siralama_mantigi(const BirTur & birinci, const BirTur & ikinci)
{
if (birinci < ikinci)
/* ... */
}


Yukarida 'birinci' 'const' oldugu icin, senin bastan yazdigin < isleci kullanilamaz. Cunku senin islecin asil nesnede bir degisiklik yapmadigi yolunda bir soz vermemektedir. Serbest < islecinin cagrilabilmesinin nedeni ise, onun parametrelerini 'const' olarak almasidir.

Yoksa aslinda serbest operator== ve operator< islecleri de sort icin gerekmezler.

Uye isleci gosterdigim gibi 'const' yap ve friend islev bildirim ve tanimlarini kaldir. Guzelce calisacaktir... :)

Ali

Darkstar
07/12/2004, 18:59
Ok. şimdi çalıştı. Yani biz fonskiyonun sonunda "const" kullanarak fonskiyonumuzun aldıgı parametreleri değiştirmeyeceğine dair bir söz mü vermiş oluyoruz? Yoksa zaten parametrelerin başında const vardı.

Arkantos
07/12/2004, 20:36
Ok. şimdi çalıştı. Yani biz fonskiyonun sonunda "const" kullanarak fonskiyonumuzun aldıgı parametreleri değiştirmeyeceğine dair bir söz mü vermiş oluyoruz? Yoksa zaten parametrelerin başında const vardı.

bool operator<(const Cat& right) const
{
/* ... */
}


const Cat& right şeklinde kullanımda (Kedi mi bu :) Aslında Cat& türünden bir referans olan right'ı o işlev içinde değiştirmeyeceğime söz veriyorum.

İşlevin en sonundaki const ise tamamen farklı anlama geliyor. Yani bu üye işlevin atama, arttırma, azaltma.. gibi kullandığımız sınıfın veri üyeleri üzerinde hiç bir değişiklik yapmayacağına da söz vermiş oluyoruz.

acehreli
07/12/2004, 21:07
Bir baska deyisle, islevin sonundaki 'const', uye islev icindeki 'this' parametresini 'const' yapiyor. Arkantos'un yazdigi islev icinde 'this'in turu 'const Cat *' oluyor. Onun icin de uyelerde degisiklik yapamiyoruz.

Ali

Darkstar
07/12/2004, 22:37
Ok. şimdi oldu :)