Alıntı (Salih Dinçer):
> Peki ya static olmaz ise niye "Parçalama arızası" verir? Örneğin şurada statik olmayan sınıf elemanlarına hiç bir şekilde ulaşamıyorum:
> class bellek {
> int d;
> static int s;
> }
> void main () {
> auto b = new bellek [2];
> b[1].s=1;
> writefln ("static bellek'in 1. elemanı: %d", b[0].s);
> writefln ("static bellek'in 2. elemanı: %d", b[1].s);
> }
> ```
>
Hatırlatmak için, ve başka arkadaşlar denemedilerse diye, static üyeler bütün tür için tek oluyorlar; static olmayan üyeler ise her nesne için ayrı oluyorlar. Yani yukarıdaki bellek.s yalnızca bir adet ama bellek.d her nesne için farklı.
Yukarıdaki programı işlettiğimizde şunu görüyoruz:
'static bellek'in 1. elemanı: 1
static bellek'in 2. elemanı: 1
'
İki elemanın s üyeleri de aynı olduğu için ikisi de aynı. O üyeyi b[1].s diye ilklemek yerine sınıfın 'static this' işlevi de kullanılabilir. 'static this' her tür için yalnızca bir kere işletilir ve en azından o türün static üyelerini ilklemek için mantıklıdır:
class bellek {
int d;
static int s;
static this()
{
s = 42;
}
}
Yukarıdaki kod sabit bir değer kullandığı için s aslında tanım satırında da ilklenebilir:
class bellek {
int d;
static int s = 42;
}
Ama tabii 'static this' bambaşka kodlar da işletilebildiği için duruma göre yeğlenir.
static olmayan üyeler konusunu sona bıraktım. :) b[0].d deyince hata olmasının nedeni, D'de sınıfların *referans türü* olmaları. b[0] ve b[1] C'deki NULL göstergelerinin eşdeğeri durumundalar. Gerektiğinde şöyle denetlenebilir:
if (b[0] is null)
class nesnelerinin new ile oluşturulmaları gerekir. struct'ta durum öyle değil, çünkü onlar değer türleri. C ve C++'tan gelenler (ben dahil! :)) referans türlerine yabancı olabilirler. Java ve C#'tan gelenler zaten biliyor olmalılar. Bununla ilgili şöyle bir şey var:
http://ddili.org/ders/d/deger_referans.html
Ayrıca bu sorunun dizilerle ilgisi olmadığını da belirtmek gerek, yoksa şu da aynı hataya sahip:
bellek b;
writeln(b.d);
Daha da ayrıca, :) main'in başındaki 'static'i hiç görmemiştim. Etkisi olduğunu sanmıyorum.
Son olarak, eğer bütün dizi baştan oluşturulması gerekmiyorsa diziyi hep sonuna ekleyerek de oluşturabilirsin:
import std.stdio;
import std.string;
class bellek {
int d;
static int s;
this(int d) {
this.d = d;
}
override string toString() const
{
return format("%s", d);
}
}
void main () {
bellek[] dizi;
foreach (i; 0 .. 10) {
dizi ~= new bellek(i);
}
writeln(dizi);
}
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]