Her zaman başlık dosyaları hakkında kafam karıştı. Çok garip: .cpp içermeyen .h dosyası ekliyorsunuz ancak .cpp bir şekilde de derleniyor.
Son zamanlarda bir takım projesine katıldım ve elbette hem .h hem de .cpp kullanılıyor.
Bunun çok önemli olduğunu anlıyorum, ancak sahip olduğumuz birden çok sınıftaki her işlev bildirimini kopyalayıp yapıştırarak yaşayamıyorum.
2 dosya kuralını verimli bir şekilde nasıl ele alırım?
Bu konuda yardımcı olacak veya aşağıdaki gibi görünen bir dosyayı otomatik olarak .h ve .cpp olarak değiştirecek herhangi bir araç var mı? (özellikle MS VC++ 2010 için)
class A { ... Type f(Type a,Type b) { //implementation here, not in another file! } ... }; Type f(Type a) { //implementation here } ...
Lzz kullanabilirsiniz. Bir C++ sözdiziminde yazılmış bildirimleri alan ve üstbilgi ve kaynak dosyalarını oluşturan bir komut satırı aracıdır.
C++ 'da üstbilgileri kullanmak için yoktur. Tüm nesneyi tek bir dosyada C # veya Java ile olduğu gibi tanımlayabilirsiniz. C geliştiricileri genellikle harici çağrıları bir başlık dosyasında tutarlar. Tüm dahili çağrılar .c dosyasında tanımlanır. Aynı şekilde, C++ .h dosyalarınızı sınıflar/arayüzler (saf sanal soyut sınıflar)/etc için ayırabilirsiniz. DLL dışında paylaşılması amaçlanan. İç sınıflar/yapılar/arayüzler vb. İçin ihtiyacınız olan .cpp dosyasını eklemeniz yeterlidir:
#include<myclass.cpp>
Bu en popüler yaklaşım gibi görünmüyor, ancak yasal C++. Kesinlikle tüm iç kodunuz için bir olasılık olacaktır. Bu, dahili kodun ve sınıf kümesinin çok daha radikal bir şekilde değişmesine izin verirken, kitaplığınızın/çalıştırılabilir kodunuzun dışındaki etkileşime girmesi için daha kararlı bir arayüz sağlar.
Tüm sınıfınızın bir dosyaya sahip olması, istediğiniz şeyi yapmayı kolaylaştıracaktır. Bir yöntemin yeniden adlandırılması ve bu yöntemin çağrıldığı her yerde arama yapılması sorununu çözmez, ancak daha anlaşılır hata iletilerine sahip olduğunuzdan emin olur. Başlığınızın bir yöntemi bir şekilde bildirmesinden daha kötü bir şey yoktur, ancak farklı şekilde uygularsınız. Üstbilgi dosyasını çağıran diğer kod düzgün bir şekilde derlenir ve bir bağlantı istisnası alırken, uygulama dosyası yöntemin tanımlanmadığından şikayetçi olur. Her yöntemi (gerçek sınıf bildiriminde) tanımladığınızda, hangi dosyayı içeriyor olursa olsun aynı hata iletisini alırsınız.
Bu soruya da bakmak isteyebilirsiniz: C++ için iyi yeniden düzenleme araçları
Temel C düzeyinde (ve C++ bu temel üzerine inşa edilmiştir), başlık dosyaları bir işlev/yapı/değişkenin vaadini bir derleyicinin nesne dosyasını yaratmasına izin ver. Benzer şekilde C++ başlık dosyaları, işlevlerin, yapıların, sınıfların, vb. Vaadini beyan eder. Derleyicinin yığında yer ayırmak için kullandığı bu tanımdır.
.C veya .cpp dosyaları uygulamaya sahiptir. Derleyici her bir uygulama dosyasını bir nesne dosyasına dönüştürdükçe, eklenmemiş kavramlara (başlıkta bildirilen) kancalar vardır. Bağlayıcı, kancaları diğer nesne dosyalarındaki uygulamalara bağlar ve tüm kodu içeren daha büyük bir ikili dosya oluşturur (paylaşılan kitaplık veya yürütülebilir).
Visual Studio'dakilerle çalışmaya gelince, işleri biraz daha kolaylaştıran bazı sihirbazlar var. Yeni sınıf sihirbazı eşleşen çift başlık ve uygulama dosyalarınızı oluşturur. Yeni yöntemler bildirmenize izin verecek bir sınıf tarayıcı özelliği bile vardır. Başlıktaki tanımı ve .cpp dosyasındaki uygulama saplamasını enjekte eder. Visual Studio on yıldan fazla bir süredir bu özelliklere sahip (kullandığım sürece).
Java geliştirici olun).
Gerçekten C++ ile geliştirmeye devam etmek zorundaysanız, bir IDE kullanmayı deneyebilirsiniz. Genellikle bir sınıfa yöntem ekleyebileceğiniz bir mekanizma sunarlar ve bildirimi otomatik olarak .h dosyasına ve tanımı .cpp dosyasına yerleştirir.
Yeni bir sınıfın ilk satırlarını yazdığınızda, bunun nedeni genellikle sadece o yerde tek bir yerde bulunmasıdır. Daha sonra, daha fazla yerde kullanılabilir, ancak başlangıçta genellikle kullanılmaz.
Sınıflarımın çoğu geçerli .cpp dosyasının en üstünde başlar. Birden fazla yerde kullanmak için yeterince stabil olduğunda, bir başlığa kesip yapıştırıyorum. Sık sık sınıf göründüğü kadar hızlı kaybolur.
Header (.h) dosyası koda interface kodunu tanımlar, çünkü only bit --- other kodunu görür.
Kaynak (.cpp) dosyası, kimsenin bilmemesi gereken kodun uygulanmasını sağlar.
.cpp içermeyen .h dosyasını eklersiniz ...
Doğru.
Bu kodun bir tüketicisi olarak, yalnızca Header dosyasına ihtiyacınız vardır, böylece derleyici çalışmanız için bu kodda nelerin mevcut olduğunu bilir. C++ kaynak kodu bu noktada hiçbir şekilde, şekilde veya biçimde kullanılmaz (veya en azından olmamalıdır be).
... ama .cpp bir şekilde de derleniyor.
Evet, ama tamamen ayrı ayrı.
Kullandığınız bir modülün/kitaplığın .cpp dosyası, bu kitaplığın Geliştiricisi tarafından bir Nesne dosyasına (.o/.dll) derlenir. Bu nesne dosyası, Başlık dosyasında açıklananlarla aynı "şekil" olan giriş noktalarını içerecektir.
link tamamlanmış yürütülebilir programınıza geldiğinizde bu Object dosyasına ihtiyacınız olacaktır; bu noktada Linker, Object dosyasının içeriğini alabilir ve yürütülebilir dosyaya gömebilir (statik bağlantı içindir; dinamik bağlantı daha karmaşık)
Temel olarak bağlayıcı, Başlık dosyasında gördüklerine ve gerçekte ne olduğuna bağlı olarak, kodunuzun beklediği arayabileceği giriş noktaları arasında "noktaları birleştirmelidir" kütüphanenin kendisi).