Alıntı (Salih Dinçer):
> ilk aklıma gelen çözüm ile ikincisinin karışımını denediğimde "access violation" hatası alıyorum...
> this(int veri, kar ismi) {
> this.bilgi = veri;
> this.sınıf.adı = ismi.adı;
> }
> ```
this.sınıf null olduğu için.
Alıntı:
> Dikkat ederseniz kopyala() işlevinin yanındaki const takısını iptal ettim çünkü bu sefer de başka hata veriyordu.
nar kopyala() @property const {
return new nar(bilgi, sınıf);
}
'
Error: constructor deneme.nar.this (int veri) is not callable using argument types (const(int),const(kar))
Error: cannot implicitly convert expression (this.sınıf) of type const(kar) to deneme.kar
'
kopyala'yı const yaptığımız zaman bu nesnenin hiçbir üyesini değiştirmeyeceğimiz sözünü vermiş oluyor. Ama ondan sonra 'sınıf' üyesini yeni bir nesne oluştururken kurucu işleve geçiriyoruz. O kurucunun bizim 'sınıf'ta değişiklik yapmayacağı belli değil. Onun için kurucunun da const kar alması gerek:
class nar {
int bilgi;
kar sınıf;
this(int veri) {
this.bilgi = veri;
sınıf = new kar();
}
this(int veri, const kar ismi) {
this.bilgi = veri;
this.sınıf = ismi.kopyala();
}
nar kopyala() @property const {
return new nar(bilgi, sınıf);
}
}
class kar {
string adı;
this(string veri = "") {
this.adı = veri;
}
kar kopyala() const {
/* Burada adı'yı ayrıca kopyalamaya gerek yok çünkü nasıl olsa
* immutable char'lardan oluşuyor. Bu nesne ve yeni oluşturulan nesne
* aynı karakterleri paylaşacaklar. Güzel... :) */
return new kar(adı);
}
}
Alıntı:
> bize bildirilen üyeleri bilseydik gerçek manada kopyalayamazdık.
Doğru. Nasıl kopyalandığını türün kendisinin bilmesi gerek.
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]