Merhaba,
Ali hocam, D.ershane'de yapıları anlatırken çok basit ve de yerine göre çok çok önemli olabilecek bir sorun ile çözümüne değinmiş. Hem de çözümü aşağıda göreceğiniz üzere dahili halini de ilerleyen derslerde vermiş. Ancak bu çözüm sınıflarda çalışmadığını belirtmeliyim...
Örneği biraz zenginleştirdim, kısaca çalışan kod şöyle:
import std.conv, std.stdio;
struct Öğrenci {
int numara;
int[] notlar;
this(this) { notlar = notlar.dup; }
string toString() const {
bool yazma;
enum ders { Türkçe, Japonca, Matematik }
string sonuç = to!string(numara) ~ " numaralı öğrencinin notları: (";
foreach(adı, notu; notlar) {
if(yazma) sonuç ~= ", ";
sonuç ~= to!string(cast(ders)adı) ~ "=" ~ to!string(notu);
yazma = true;
}
return sonuç ~ ")\n";
}
}
void main() {
auto Ali = Öğrenci(42, [70, 60, 90]);
Ali.writeln("\tismi: Ali");
auto Salih = Ali;
Salih.numara = 41;
Salih.writeln("\tismi: Salih");
"Ali, Türkçe'den +1 not aldığında notu şu oldu: ".writeln(++Ali.notlar[0]);
"Salih'e notlarına n'oldu?\n".writeln(Salih);
}
Çıktıyı vermiyorum çünkü denemeli (kurucu satırı aç/kapa yapmalı) ve farkı görmelisiniz. Ama tahmin edeceğiniz üzere, bahsedilen sorun referans üyeler içeren bir yapıyı başkasına kopyaladığınızda aslında her iki yapı tıpkı static olarak işaretlenmiş gibi tek bir değişkeni gösterecektir. O yüzden referans türler kullanırken dikkatli olmalı veya yukarıdaki gibi önlem almalısınız.
Ayrıca burada orijinal ismi "post blits" olan bir şey daha yapılıyor. Hiç bir parametre almayan kurucu işleve this ekleniyor: this(this) { ... } Böylece önceki yapının değerleri aynen aktarılırken ek olarak kurma işlevini genişletiyorsunuz.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]