PDA

Tam Sürümünü Görmek İçin : swap


quasimodo
04/12/2007, 15:39
std::swap() sadece temel turlerlemi calisir? Bir String
sinifinin operato =() fonksiyonunu asagidaki gibi
iken;

void String::degisTokusYap (String & diger)
{
std::swap (boy_, diger.boy_);
std::swap (icerik_, diger.icerik_);
}

String & String::operator =(const String & str)
{
String gecici (str);
this->degisTokusYap (gecici);
return *this;
}
yerine

String & String::operator =(const String & str)
{
String gecici (str);
std::swap (*this, gecici);
return *this;
}
gibi neden yapamiyoruz? Yoksa ben std::swap() i yanlismi
anladim :(

Daha once new ile yer ayrilmamis pointer'i delete etmek
yasal miydi?


myavuzselim
04/12/2007, 17:46
std::swap() sadece temel turlerlemi calisir? Bir String
sinifinin operato =() fonksiyonunu asagidaki gibi
iken;

void String::degisTokusYap (String & diger)
{
std::swap (boy_, diger.boy_);
std::swap (icerik_, diger.icerik_);
}

String & String::operator =(const String & str)
{
String gecici (str);
this->degisTokusYap (gecici);
return *this;
}
yerine

String & String::operator =(const String & str)
{
String gecici (str);
std::swap (*this, gecici);
return *this;
}
gibi neden yapamiyoruz? Yoksa ben std::swap() i yanlismi
anladim :(


Tahminim burada stack overflow'a neden oluyorsundur. Kendin bir swap yazsan nasil yazarsin?

template<typename T>
void swap(T& a, T& b) {
T temp = a;
a = b; // ozyineleme!
b = temp;
}

acehreli
04/12/2007, 20:35
degisTokusYap'in ismini swap olarak degistirip onu kullanman gerekiyor:

this->swap(gecici);

veya

gecici.swap(*this);

Cunku senin tUrUnun nasil degis tokus yapilacagini ancak sen biliyorsun.

Ali