Bunu sadece bir yorumdan ziyade ayrı bir cevap olarak yazıyorum çünkü yasallık temelinde değil, sağlam yazılım ve yanlış yorumlanma tehlikesi nedeniyle Luc Touraille'in cevabına katılmıyorum.
Özellikle, arayüzünüzün kullanıcılarının bilmesini beklediğiniz şeyle ilgili zımni sözleşme ile ilgili bir sorunum var.
Referans türlerini iade ediyorsanız veya kabul ediyorsanız, sadece bir işaretçi veya referanstan geçebildiklerini söylüyorsunuz, bu da sadece ileri bir bildirim yoluyla bildikleri anlamına gelir.
Eğer tamamlanmamış bir türü döndüren zaman X f2();
sonra arayan söylediğini mutlaka X'in tam tür özelliklerine sahip Çağrı sitesinde LHS veya geçici nesne oluşturmak için buna ihtiyaç duyuyorlar.
Benzer şekilde, eksik bir türü kabul ederseniz, arayanın parametre olan nesneyi oluşturması gerekir. Bu nesne bir işlevden eksik başka bir tür olarak döndürülse bile, çağrı sitesi tam bildirime ihtiyaç duyar. yani:
class X; // forward for two legal declarations
X returnsX();
void XAcceptor(X);
XAcepptor( returnsX() ); // X declaration needs to be known here
Bir üstbilginin, diğer üstbilgileri gerektiren bir bağımlılık olmadan kullanmak için yeterli bilgi sağlaması gerektiği önemli bir ilke olduğunu düşünüyorum. Bu, bildirdiği herhangi bir işlevi kullandığınızda başlık derleyici birimine derleme hatasına neden olmadan eklenebileceği anlamına gelir.
Dışında
Bu dış bağımlılık isteniyorsa davranış. Koşullu derleme kullanmak yerine, X bildiren kendi başlıklarını sağlamaları için iyi belgelenmiş bir gereksiniminiz olabilir.
Önemli bir ayrım, onları somutlaştırmamanız gereken bazı şablon teknikleridir, sadece birisinin benimle sersemlememesi için bahsedilmiştir.