2016-04-21 15 views
6

kullanarak veya dahil bir tür ileriye ilan edilebilir, döngü önlemek için, bu gibi kod yol açar: ileri beyanı sayısı büyük hale gelirseİleri ilan ve bir optimizasyon olarak tek adımda

class A; 

class B 
{ 
    A *a; 
}; 

, onu başlık dosyasının üst kısmında çok yer kaplayabilir. Aynı anda bildirmek ve kullanmak için bir yolu var mı?

class B 
{ 
    extern A *a; 
}; 

Gerçekten daha önce bu konuda hiç düşünmedim ama (dosyası içerir diğerine onları çiftçilik olmadan) Ben ileriye bildirimleri bir grup ile bir başlığa sahip ve bunu Sessizleştirme yapmak istiyorum: Bir bakıma ister .

DÜZENLEME: İşaretçiyi ve başvuruları yalnızca ileri bildirimleri kullanabileceğinizi doğru bir şekilde belirttiği için 'a' işaretçisini değiştirdim. A referans veya işaretçi türü olmadığı sürece bir ileriye doğru bildirimi nesnenin boyutuna herhangi bir ek bilgi vermez çünkü

cevap

5

sen soruyorsun Ne doğru anlamadıysam, kendi değişkenleri bildirerek aynı zamanda de beyan iletebilirsiniz tamamen net değil ama?

+1

İlginç, Daha önce kullanılan bu sözdizimini hiç görmedim. –

+0

Teşekkürler. Tam olarak aradığım şey buydu ve hayır, daha önce hiç böyle bir şey görmedim. Üstbilgi dosyasını temizlemeye yardım etti. –

4

bir ileriye doğru bildirimi (sen

class A; 

class B 
{ 
    A a; 
}; 

yapılacak izin vermez için sürece C++ 11'de enum class. Yani işaretçiler/referanslar kullanıyor musunuz? Aksi halde, A'un tanımını da dahil ettiğiniz anlamına gelir.

Sorununuzla ilgili olarak, iki farklı şeyden bahsettiğimiz için bir tür bildirme ve kullanmanın bir yolu yoktur. Bir değişken beyanı bir türü tanımlamaz, bir değişken tanımlar.

Sorununuza basit bir çözüm, tüm ileri bildirimleri tek bir başlık dosyasında toplamak ve projeye dahil etmek (veya önceden derlenmiş üstbilgisinde). Bu, ileriye dönük deklarasyonlar hiçbir şey göstermediği ve ağır olmadıkları için çok fazla sorun yaratmaz.

+0

Özür dilerim, örneğin benim hatam. –

3

Hayır, ne istersen yapamazsın. İleri bildirimlerle ilgili This answer, size tüm detayları vermek zorundadır, ancak özet olarak, kullanmak istediğinizde tam bir tür tanımına ihtiyacınız vardır (daha fazla veya daha az dahil); sadece var olduğu gerçeği değil (ileri ya da daha az ilan ettiği gibi).

class B 
{ 
    class A* a; // declaring A as class is an in-place forward declaration 
}; 

ne demek böyle mi:

+0

Üzgünüm, örneğim kırılmıştı. –

İlgili konular