Jump to page: 1 2
Thread overview
D.ershane Özel İşlevler
Apr 20, 2011
erdem
Apr 20, 2011
mert
Apr 20, 2011
erdem
Apr 20, 2011
mert
Apr 20, 2011
erdem
Apr 20, 2011
mert
Apr 20, 2011
erdem
April 20, 2011

Aslında bu bir hata değil. Ama ek bilgi olarak bahsedilmiş olsa iyi olur diye düşünüyorum. Belki başka bölümlerde de bahsedilmiş olabilir.

struct BirYapı {

   this() {}
}

Örneğin bu kodu derlemeye çalıştığımızda:

Alıntı:

>

Error: constructor deneme.BirYapı.this default constructor not allowed for structs

Yani hata mesajına bakarak derleyicinin varsayılan kurucuya 'this()' yapılarda izin vermediğini sadece sınıflarda izin verdiğini görüyoruz.

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

April 21, 2011
import std.stdio;

class BirYapı {

   this( )
   {
   }

	~this()
	{
	}

}

Ama Erdem; yapıların aksine sınıflarda vermiş olduğun kod derlenir. Bunun yapıların değer türü, sınıfların referans türü olması ile ilgisi var mı diye sormak istiyorum bu noktada ben?

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

April 21, 2011

Alıntı (mert):

>

Ama Erdem; yapıların aksine sınıflarda vermiş olduğun kod derlenir. Bunun yapıların değer dürü, sınıfların referans türü olması ile ilgisi var mı diye sormak istiyorum bu noktada ben?

Evet sınıflarda derleniyor. Bunun nedeni sanırım tüm türlerin bir ilklendirme değeri var. Örneğin 'int' için 0, kayar noktalı sayılar için 'NAN', sınıflar için 'null' gibi. Yapılar için bu değer tüm elemanlarının ilklendirildiği değerler.

Yapılar da bir tür olduğu için bu yüzden elemanlarının ilklendirildiği değerler dışında özel bir ilklendirme değeri alamadıklarından varsayılan kurucuya izin verilmiyormuş galiba.

Rica ederiz :)

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

April 21, 2011

Aslında yazmış olduğunuz kod şunun eşdeğeri olmakta değil mi?

struct BirYapı
{

}

Ancak bu kod derleniyor. Bu noktada referans türü, değer türü ayrıştırmam anlamsızlaşmaya başlıyor. Bu davranış tamamen yapılardaki kurucu işlev ile mi ilgili ?

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

April 21, 2011

Sizin yazdığınız örnekte otomatik kurucu çalıştırılıyor. Ama eğer kendimiz bir kurucu işlev tanımlarsak o zaman otomatik kurucuyu iptal ediyor.


struct Süre {
   int dakika;

   this(int saat, int dakika) {
       this.dakika = saat * 60 + dakika;
   }

   this(int dakika) {
       this(0, dakika);
   }

}

gibi. Artık otomatik kurucu iptal oldu. Sadece 'this() 'varsayılan kurucuyu (parametre almayan) programcı kendi tanımlamaya çalışırsa hata veriyor.

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

April 21, 2011

Şimdi aklımdaki sorulara yanıtlar bulabildim. Erdem'in de bahsettiği gibi ilk değerleri .init olarak alıyor. Biz otomatik kurucu işlevi iptal ettiğimizde ise bir nesne tanımlamak ve o nesnenin ilk değerlerini otomatik olarak verilebilecek veya elle ayarlayarak kurucu işlevi tasarlamak zorunda oluyoruz.

Yanılmıyorum değil mi? Alıntı:

>

Sınıfların referans türü olmaları nedeniyle T.init onlarda her zaman için null.

Buraya gelmiş oluyorum böylelikle. Konuyu oldukça detaylı kavradığımı umarak. Bu tür uyarılar ve açıklamalar o kadar yararlı ki,
Teşekkür ederim hocam, teşekkür ederim Erdem: "Konuyu tam zamanında pekiştirmeme zemin hazırladığınız için."

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

April 21, 2011

Evet bu referans olma konusuna ben de dün şöyle bir göz atmıştım. Turna nedeniyle dizileri bitirmeden konu atlamayı planlıyordum :)

Örneğin otomatik diziler için dinamik olarak yer ayrılıyor. Normal diziler için örneğin fonksiyon dışında oldukları zaman genellikle statik olarak yer ayrılıyor.

Bir de bir tahmin ama yapılar bir tür olduğu için statik olarak bellekten yer ayrılıyor, sınıflar için dinamik olarak yer ayrılıyor. Acaba bu nedenden dil varsayılan kurucuya yapılarda izin vermiyor olabilir mi..

Alıntı (mert):

>

Yanılmıyorum değil mi?

Evet doğru. Hatta tüm bunlar özel işlevler konusunda anlatılmıştı :)

http://ddili.org/ders/d/ozel_islevler.html

Bir de DigitalMars haber grubunda da bu konu konuşulmuş:

http://bit.ly/ijell9

Alıntı (acehreli):

>

TDPL'i açıyorum. 7.1.3.1 Constructors bölümünün sonunda açıklanmış:

Alıntı (TDPL):

>

Bu, her türün sahip olması gereken T.init değeri ile ilgili bir konu. T.init derleme zamanında bilinmelidir; bu da çalışma zamanında işletilecek olan kurucu işlev ile çelişir. (Sınıflarda T.init null referanstır, varsayılan olarak kurulmuş nesne değildir.)

Bu daha da açık olmuş oldu :)

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

April 21, 2011

Bunu ben de farketmiştim. İçimden bir ses sonradan izin verilmemeye başladığını söylüyor. Şöyle bir ek yaptım:

Alıntı:

>

Kurucu parametreleri, yapı nesnesini kullanıma hazırlamak için gereken bilgilerden oluşur. Parametre listesi yapılarda boş olamaz:

> struct BirYapı
> {
>     this()     // ← derleme HATASI
>     {
>         // ...
>     }
> }
> ```

>
> Derleyici, varsayılan kurucunun yapılar için tanımlanamayacağını bildiren bir hata mesajı vererek sonlanır:
>
> 'Error: constructor deneme.BirYapı.this default constructor
> not allowed for structs'
>
> Bunun sınıflar için mümkün olduğunu ileride göreceğiz.

 http://ddili.org/ders/d/ozel_islevler.html

Bütün uyarılar ve düzeltmeler için tekrar çok teşekkür: :)

 http://ddili.org/ders/d/tesekkur.html

Ali

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

Alıntı (mert):

>

yapıların aksine sınıflarda vermiş olduğun kod derlenir. Bunun yapıların değer dürü, sınıfların referans türü olması ile ilgisi var mı diye sormak istiyorum bu noktada ben?

C++'ta yapılarla sınıflar arasında işlevsel olarak hiçbir fark yoktur.

D ise, baştan yapıları tekrardan C'deki yetersizliklerine döndürdü ama ondan sonra yavaş yavaş tekrar yetenekler eklemeye başladı.

Yanılmıyorsam bir noktada kurucu işlev yapılar için hiç tanımlanamıyordu bile.

Sanıyorum bu tür gariplikler ve tutarsızlıklar o nedenlere dayalı. Yapılarda neden olamayacağı konusunda hiçbir fikrim yok ...

.. diye geveledikten sonra TDPL'i açıyorum. 7.1.3.1 Constructors bölümünün sonunda açıklanmış:

Alıntı (TDPL):

>

Bu, her türün sahip olması gereken T.init değeri ile ilgili bir konu. T.init derleme zamanında bilinmelidir; bu da çalışma zamanında işletilecek olan kurucu işlev ile çelişir. (Sınıflarda T.init null referanstır, varsayılan olarak kurulmuş nesne değildir.)

Yani Mert haklı! :) Sınıfların referans türü olmaları nedeniyle T.init onlarda her zaman için null.

Ali

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

April 21, 2011

Alıntı (mert):

>

Biz otomatik kurucu işlevi iptal ettiğimizde ise bir nesne tanımlamak ve o nesnenin ilk değerlerini otomatik olarak verilebilecek veya elle ayarlayarak kurucu işlevi tasarlamak zorunda oluyoruz.

Yanılmıyorum değil mi?

Çok doğru.

Benim hep C++'tan aklıma gelen düşünce ise doğru değil: Aynı dersteki "Programcının kurucusu otomatik kurucuyu iptal eder" başlığı, sanki varsayılan kurucu da iptal edilirmiş gibi anlaşılıyor. O doğru değil. (Onu da düzeltmem gerek.)

Alıntı:

>

Bu tür uyarılar ve açıklamalar o kadar yararlı ki,

Ben de tam onu söyleyecektim! Böyle bir tartışma olmasa, hepimiz bu konuyu bir metin parçası olarak okuyup geçmiş durumdaydık. Artık hiçbirimiz unutamayız. :)

Ali

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

« First   ‹ Prev
1 2