Thread overview
yapılarda this()
Jun 20, 2020
cos00kun
Jun 21, 2020
cos00kun
Jun 21, 2020
cos00kun
June 21, 2020

Bugün .yapılarda this() konusuna bakıyorum.. C++ de kurucu işlev nesne oluşumuyla otomatik çalışırdı. Ancak aşağıdaki kodda 'this(int a) {' parametre olmadan yani 'this() {' şeklinde kullanılınca derlemeden hata atıyor. Mantığını anlayamadım.

Hata Mesajı: '2.d(6): Error: constructor d2.OyunKağıdı.this default constructor for structs only allowed with @disable, no body, and no parameters'

import std.stdio;

struct OyunKağıdı {
   dchar renk;
   dchar değer;

   this() {
       writeln("Kurucu Çalıştı..");
   }

    ~this() {
       writeln("Yokedici Çalıştı..");
   }
}

void main() {
   OyunKağıdı kağıt1;
   writeln("Kağıt1 adres: ",&kağıt1);
   writeln("Kağıt1 renk adres: ",&kağıt1.renk);
   writeln("Kağıt1 değer adres: ",&kağıt1.değer);
   OyunKağıdı kağıt2;
   writeln("Kağıt2 adres: ",&kağıt2);
   writeln("Kağıt2 renk adres: ",&kağıt2.renk);
   writeln("Kağıt2 değer adres: ",&kağıt2.değer);
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 21, 2020

Ne diyeyim bilemedim :-D ama hoş düşüncelerim yok bu konu hakkında çünkü takla atmadan bunu yapabilmeyi umuyordum en azından. Sonuçta C++ de yapılıyorsa burda da yapılabilmeiliydi ama dediğiniz gibi ilkleme kuralı olayı bozuyor anladığım kadarıyla. Yapacak birşey yok

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 21, 2020

yok Ali hocam bir sorun yok. Nedense D diline bu sefer gereksiz yüklendim ve bunun farkındayım. Üstelik bize o kadar bol olanaklar sağlayan bir dil olduğunu neredeyse unutarak. :blush:

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 21, 2020

Bu konuya herkes takılır. :) D'de her türün derleme zamanında bilinmesi gereken bir ilk değeri vardır. Yapıların ilk değerleri derleme zamanında üyelerinin ilk değerlerinden oluşur. this()'e izin verilseydi, çalışma zamanındaki ilk değer derleme zamanındakinden farklı olurdu. O yüzden mümkün değil.

Bununla ilgili iki "çözüm" var:

  • 'static opCall', türün kendisinin işlev gibi çağrılmasını sağlar (varsayılan kurucu ile aynı yazım). Bunun bazı durumlarda karışıklığa neden olduğunu duymuştum ama şimdi hatırlayamıyorum.

  • Yapı isminin küçük harfiyle başlayan bir işlev çağrılır

struct S {
 int i;

 static opCall() {
   S s;
   s.i = 42;
   return s;
 }
}

auto s() {
 S s;
 s.i = 42;
 return s;
}

void main() {
 auto a = S();  // <- static opCall'u çağırır
 auto b = s();  // <- s()'yi çağırır (Dikkat: küçük 's')
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 21, 2020

Konu yapabilmek değil, özellikle yapmak istememek. Walter Bright, D'de bütün türlerin ilk değerleri olacağını garanti etmeye karar vermiş ve bu konuda taviz vermemiş. Yoksa örneğin 'S[3]' türünün elemanlarının ilk değerleri bilinemezdi: Programcı this() tanımlayabilseydi bir readln() ile okuduğu değeri bile kullanabilirdi. Bu da derleyicinin 'S[3]' için derleme zamanında bilinen ve hedefe hemen kopyalabilecek olan bir sıfır değeri kuramayacağı anlamına gelirdi.

D'nin çok sorunu var ama bu onlardan birisi değil. :)

Bu kuralın önemli bir kısıtlama olduğunu düşünüyor musun? Bir örnek üzerinden düşünürsek belki başka çözümler bulabiliriz. Hatırlatmak için, örneğin, bir yapının derleme zamanında bilinen ilk değeri kurucu olmadan da ayarlanabilir:

struct S {
 int i = 42;    // Evet, kurucu değil ama çoğu amacı karşılar
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]