Alıntı (canalpay):
>
- Soru
Doğru. (Ama fazla kolaydı tabii... :p)
Alıntı:
> 2.Soru :
> override int opCmp(Object o)const
> {
> auto sağdaki = cast(const Nokta)o;
> if(x != sağdaki.x ) {
> return x - sağdaki.x;
> } else {
> if ( y != sağdaki.y ) {
> return y - sağdaki.y;
> } else {
> return 0;
> }
> }
> }
> ```
Ben de aynısını '?:' işleciyle daha kısa yazmışım:
override const int opCmp(Object o)
{
auto sağdaki = cast(const Nokta)o;
return (x != sağdaki.x
? x - sağdaki.x
: y - sağdaki.y);
}
Anlaşılan, o sıralarda 'const''ı işlev parametrelerinden sonra yazmaya karar vermemişim daha. Artık seninki gibi yazıyorum ama ondan önce kesin bir boşluk bırakırım. ;)
Alıntı:
>
> 3.Soruyu daha çözemedim. Geldiğim yer :
>
>
> void main()
{
enum Renk { mavi, yeşil, kırmızı };
class Nokta
{
Bir şeye dikkat ettim: sen türleri main'in içinde tanımlamışsın. Zararı yok ve D buna izin veriyor ama normalde işlevlerin dışında tanımlanır. Eğer bir tür yalnızca tek işlev içinde kullanılacaksa, yani o kadar yerelse, o zaman tek işlevin içinde tanımlandığı da olur.
Alıntı:
>
> class ÜçgenBölge
> {
> Nokta[3] noktalar;
>
> this(Nokta bir, Nokta iki, Nokta üç)
> {
> noktalar = [ bir, iki, üç ];
> }
>
> override bool opEquals(Object o) const
> {
> auto sağdaki = cast(const ÜçgenBölge)o;
>
> return ((noktalar[0] == sağdaki.noktalar[0])
> &&
> (noktalar[1] == sağdaki.noktalar[1])
> &&
> (noktalar[2] == sağdaki.noktalar[2] ));
> }
> ```
Ben, sabit uzunluklu dizilerin bir özelliğinden yararlanmışım:
override const bool opEquals(Object o)
{
auto sağdaki = cast(const ÜçgenBölge)o;
return noktalar == sağdaki.noktalar;
}
Sabit uzunluklu diziler değer türü oldukları için, yukarıdaki basit karşılaştırma çalışıyor.
Alıntı:
>
> override int opCmp(Object o) const
{
auto sağdaki = cast(const ÜçgenBölge)o;
if ( noktalar[0] != sağdaki.noktalar[0]) {
if (noktalar[0] > sağdaki.noktalar[0]) {
return 5;
} else {
return -5;
}
} else {
if( noktalar[1] != noktalar[1] ) {
if (noktalar[1] > sağdaki.noktalar[1]) {
return 5;
} else {
return -5;
}
} else {
if( noktalar[2] != sağdaki.noktalar[2] ) {
if (noktalar[2] > sağdaki.noktalar[2]) {
return 5;
} else {
return -5;
}
} else {
return 0;
}
}
}
}
Benimki şöyleymiş:
override const int opCmp(Object o)
{
auto sağdaki = cast(const ÜçgenBölge)o;
foreach (i, nokta; noktalar) {
const int karşılaştırma =
nokta.opCmp(sağdaki.noktalar[i]);
if (karşılaştırma != 0) {
return karşılaştırma;
}
}
return 0;
}
Alıntı:
>
>
> override hash_t toHash() const
> {
> // Yanlış buraya ne gelecek ki ? return noktalar[0] + noktalar[1] + noktalar[2];
> }
>
> }
>
> }
> ```
Ben şöyle yapmışım:
override const hash_t toHash()
{
return typeid(noktalar).getHash(&noktalar);
}
Ama şimdi bir şüphem var! Çünkü derleyicinin değer türleri için kullandığı getHash, nesnelerin bütün bitlerini göze alır. Oysa ben renkleri göz ardı etmek istemiştim. Sanırım benim yazdığım doğru olmaz.
Alıntı:
> opCmp işleç yüklemesini tanımlarken opEquals işleç yüklemesinide tanımlamak gerekiyor diyor derste. Ama ben tanımlamadan derleyebiliyorum.
O konu, programın doğruluğu ile ilgilidir. Tür için eşitlik, sıralama, veya hash hesabını bir kere kendimiz yazmaya başlamışsak; her üçünün birbirleriyle tutarlı olmalarını sağlamamız gerekir. Yoksa, o nesnelerin kullanıldığı algoritmalar yanlış çalışabilirler.
O yüzden, yukarıda benim yazdığım toHash'in doğru olup olmadığından şimdi emin değilim. opEquals ve opCmp renk'i gözardı ediyorlar ama derleyicinin yazdığı hash hesabı bunu bilmiyor.
Şimdi zamanım yok ama bunun doğru olup olmadığını öğrenip yazacağım. (Bana hatırlatın! :) )
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]