Forum: Diğer Konular RSS
forward declare nedir ?
hsencan #1
Üye 2 haftadır · 9 mesaj · Konum: Afyonkarahisar
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: forward declare nedir ?
Erdem hocam tekrar teşekkürler ilginiz için.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4644 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bir ismin (symbol) ne olduğunu tanımını vermeden bildirmetkir. Örneğin,
int foo(double);
yazıldığında foo'nun double parametre alan ve int döndüren bir işlev olduğu anlaşılır. O kadarı, o işlevi çağıran diğer kodlar için yeterlidir çünkü derleyicinin tek yaptığı, "bu noktada foo'yu bu değişkenin değeriyle çağır ve dönüş değerini şu değişkene ata" anlamına gelen kodlar üretmektir. foo'nun tanımının nerede olduğu programın bağlanması (linking) aşamasına kadar bilinmez. Bağlayıcı nerede bulduysa "foo'yu çağır" bilgisini "şu adresteki kodu işlet" olarak değiştirir.

Ali
kerdemdemir #3
Üye Eyl 2013 tarihinden beri · 168 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bende örnek vermek istedim,

Diyelim ki iki tane sınıfımız var birisi

A.h dosyasında A isimli bir class

#include "B.h"
class A
{
    B* b;
}

Ve B.h dosyasında B isimli bir class

#include "A.h"
class B
{
   A* a;
}

İki dosyanın birbirine bağımlılığı var. Include işlemi kopyala yapıştır gibi bir şey olduğundan yukardaki durum "circular dependency" oluşturur. Ve kod derlenmez. Bu kodlayama yeni başlayanlar için(benim ilk projemde olmuştu) bütün projeyi açmaza sürekleyebilir.

Ali abimizin dediği gibi bu işi şöyle "forward declaretion" ile çözebiliriz:

class B; //-> derleyici için bu yeterli.

class A
{
    B* b;
}

class A;

class B
{
   A* a;
}

Tabi sadece referans ve pointer olarak tanımladı isek forward declare edebiliriz.

******** Burası biraz detay **************
Bunun sebebi ise derleyicinin sınıfın boyutlarını bilmesinin gerekmesi yani sizeof operatörünü çalıştırabilmesi.Gösterici ve referans türlerinin boyutu türden bağımsız 4 byte(veya 8 byte)
olduğu için bunlarda sorun çıkmaz( yani A*, B*, C* hepsi aynı uzunlukta isterse A 1000 kbyte B 1 byte olsun). Fakat :


******** Bu bence önemli yine ***********
//class B; --> artık bu derlenmez
#include "B.h"
class A
{
    B b; // Referans veya gösterici değil boyutunu bilmesi lazım derleyicinin
}

dedigimiz anda artık işin içinden "forward declaration" ile çıkamayız. Artık ne yazıkki #include "B.h" yapmalıyız.


Ne yazıkki diyorum çünkü #include komutları derleme zamanını artırdığından "forward declare" tercih edilmelidir.
Hatta kullanılması hep önerilen, QT gibi büyük platformların kullandığı "pimpl idiom" 'unun çıkış noktasıda budur.
Umarım ayıp olmuyordur ama başlık çok büyüyüp sıkıcı olmasın diye istersen pimpl idiom'unu başka bir başlığa taşıyalım yine.

Son olarak bir önceki sorudaki konumuz olan enum class kullanılmaz ise enum lar forward declare edilemezler küçüçük bir enum için koskaca bir dosya almamız gerekebilir.

Erdem
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:
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: 2018-02-24, 09:56:59 (UTC -08:00)