Thread overview
forward declare nedir ?
Feb 10, 2018
hsencan
Feb 11, 2018
kerdemdemir
February 10, 2018

Erdem hocam tekrar teşekkürler ilginiz için.

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

February 11, 2018

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

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

February 10, 2018

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

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