Forum: Ders Arası RSS
D.ershane Özel İşlevler
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D.ershane Özel İşlevler
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:

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.
Avatar
mert #2
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: değer türleri referans türleri üzerine bir gözlem
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?
mert
Bu mesaj mert tarafından değiştirildi; zaman: 2011-04-21, 02:17.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Bunu ben de farketmiştim. İçimden bir ses sonradan izin verilmemeye başladığını söylüyor. Şöyle bir ek yaptım:

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
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
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 mesaj erdem tarafından değiştirildi; zaman: 2011-04-21, 01:32.
Avatar
mert #5
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
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 ?
mert
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 mesaj erdem tarafından değiştirildi; zaman: 2011-04-21, 02:19.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
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ış:

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
Avatar
mert #8
Üye Ara 2010 tarihinden beri · 194 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ş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?
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."
mert
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #7
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..

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

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

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 mesaj erdem tarafından değiştirildi; zaman: 2011-04-21, 02:00.
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #8
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.)

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
acehreli (Moderatör) #11
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
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.

Düzelttim:

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

O bölümün başlığını "Programcının kurucusu otomatik kurucunun bazı kullanımlarını geçersizleştirir" olarak değiştirdim ve örneğin şöyle dedim:

tek bir kurucu işlevin bile tanımlanmış olması otomatik kurucunun bazı kullanımlarını geçersiz hale getirir, ama hiç parametre yazılmadan kurulum yine de geçerlidir

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 06:42:12 (UTC -08:00)