SORU
1 Mart 2010, PAZARTESİ


Başlık typedefs için en iyi uygulamalar dosya

Ben kullanıyorum shared_ptr ve STL kapsamlı bir proje, ve bu lider için aşırı uzun, hata eğilimli tipler gibi shared_ptr< vector< shared_ptr<const Foo> > > (ben bir ObjC programcı tarafından tercih, uzun isimleri norm ve hala bu çok fazla.) Daha net sanırım, sürekli bu FooListPtr arayıp "" shared_ptr anlamına gelir ve "Liste" shared_ptr vektör demek. Bildiğimiz bu adlandırma belgeleyen olurdu

Bu kolay typedef, ama başlıkları ile baş ağrısına neden oluyor. FooListPtr tanımlamak için birkaç seçenek var gibi:

  • Foo.h. Bu girisim yani tüm başlıkları entwines ve ciddi sorunlar yapı oluşturur.
  • FooFwd.("ileri başlık"). h Bu nedirEtkili Cöneriyor, iosfwd dayalı.h. Çok tutarlı değil, ama başlıkları sayısının iki katı tutma yükünü sinir bozucu en iyisi gibi görünüyor.
  • Ortak.sa (hepsi birlikte tek bir dosya içine koy). Bu alakasız tipleri çok entwining tarafından yeniden öldürür. Sen şimdi sadece bir nesne seçin ve başka bir proje için hareket edemiyor. Olmayan bir marş.
  • Süslü bir çeşit #eğer zaten typedefed getirilmemiş olsa da sihirli bir typedef tanımlayın. Yeni insanlarla kodu grok için zor oluyor sanırım çünkü işlemcisi için sonsuz bir tiksinti duyuyorum, ama belki....
  • Bir typedef yerine vektör sınıfı kullanın. Bu tehlikeli görünüyor...

En iyi uygulamalar var mı? Nasıl gerçek kodda, ne zaman tekrar kullanılabilirlik, okunabilirlik ve tutarlılık büyük önem taşımaktadır dışarı çıkarmak mı?

Eğer Diğerleri tartışma için ek seçenekler eklemek istiyorsanız bu topluluk wiki işaretledim.

CEVAP
26 EKİM 2010, Salı


common.h yöntemi kullanır gibi sesler bir proje üzerinde kaydediyorum. Çok iyi, Bu proje için çalışıyor.

Dosyası önceden derlenmiş üstbilgi ve sadece ileri-beyan olan ForwardsDecl.h tüm önemli dersleri ve gerekli typedefs denir. Bu durumda unique_ptr shared_ptr yerine kullanılır ama kullanımı benzer olmalıdır. Bu gibi görünüyor:

// Forward declarations
class ObjectA;
class ObjectB;
class ObjectC;

// List typedefs
typedef std::vector<std::unique_ptr<ObjectA>> ObjectAList;
typedef std::vector<std::unique_ptr<ObjectB>> ObjectBList;
typedef std::vector<std::unique_ptr<ObjectC>> ObjectCList;

Bu kod dersleri sadece ileri-ilan olsa bile, Visual C 2010 (tam sınıf tanımları her sınıf üstbilgi dosyası) eklemek gerek yok o kadar gerekli değil. kabul Bilmiyorum, eğer bu standart ve diğer Derleyiciler gerektirir tam sınıf tanımı, ama faydası yok: başka bir sınıf (ObjectD) bir ObjectAList Olarak Üye Olmadan ihtiyacı vardır ObjectA.h - bu gerçekten başlık Dosya bağımlılıkları azaltmaya yardımcı olabilir!

Bakım değildir, özellikle de bir sorun, çünkü ileriye tanımlamalar sadece ihtiyaç için yazılmış bir kere, ve herhangi bir sonraki değişiklikler tek ihtiyacınız olan şey tam bildiriminde sınıf üstbilgi dosyası (ve bu tetikleyici daha az kaynak dosyaların çekirdekler nedeniyle azaltılmış bağımlılıkları).

Son olarak göründüğü bu paylaşılabilir arasında projeler (denemedim kendime) çünkü bile bir proje değil aslında ilan ObjectA bir önemi yok çünkü sadece ileriye ilan etti ve eğer ki bu derleyici için fark etmez. Bu nedenle dosyasında kullanılan tüm projeler arasında sınıf adları içerebilir, ve eğer bazı belirli bir proje için eksik bir önemi yok. Tüm gerekli olan üstbilgi (*9 örneğin*), gerekli tüm beyannamekaynak(.cpp) dosyalarıaslında kullanınonlara.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dom Esposito

    Dom Esposito

    26 Mayıs 2011
  • DRDAnimation

    DRDAnimation

    28 EYLÜL 2012
  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010