C ++ ile arayüz ve uygulamayı düzenleme yolları


12

C ++ 'da başlık dosyasına ne girdiğine ve cpp dosyasına ne olduğuna dair birkaç farklı paradigma olduğunu gördüm. AFAIK, çoğu insan, özellikle C kökenli olanlar:

foo.h

 class foo {
 private:
     int mem;
     int bar();
 public:
     foo();
     foo(const foo&);
     foo& operator=(foo);
     ~foo();
 }

foo.cpp

 #include foo.h
 foo::bar() { return mem; }
 foo::foo() { mem = 42; }
 foo::foo(const foo& f) { mem = f.mem; }
 foo::operator=(foo f) { mem = f.mem; }
 foo::~foo() {}
 int main(int argc, char *argv[]) { foo f; }

Ancak, öğretim görevlilerim genellikle yeni başlayanlara C ++ öğretiyor:

foo.h

 class foo {
 private:
     int mem;
     int bar() { return mem; }
 public:
     foo() { mem = 42; }
     foo(const foo& f) { mem = f.mem; }
     foo& operator=(foo f) { mem = f.mem; }
     ~foo() {}
 }

foo.cpp

 #include foo.h
 int main(int argc, char* argv[]) { foo f; }
 // other global helper functions, DLL exports, and whatnot

Aslen Java'dan geliyor, her zaman birkaç nedenden ötürü bu ikinci yola yapıştım, örneğin arayüz veya yöntem adları değiştiğinde tek bir yerde bir şey değiştirmek zorunda kalıyorum, sınıflardaki şeylerin farklı girintilerini sevdiğimde uygulamalarına bakın ve isimleri ile fookarşılaştırıldığında daha okunabilir buluyorum foo::foo.

Her iki şekilde de pro ve con toplamak istiyorum. Belki de başka yollar da vardır?

Yolumun bir dezavantajı elbette ara sıra ileri bildirimlere duyulan ihtiyaçtır.


2
foo.cppArtık foosınıfınızla hiçbir ilgisi yoktur ve boş bırakılmalıdır (belki de #includeyapı sisteminizi mutlu etmek için).
Benjamin Bannier

2
Öğretim üyeleriniz deli.
Yörüngedeki Hafiflik Yarışları

Yanıtlar:


16

İkinci versiyonun yazılması daha kolay olsa da, arayüzü uygulama ile karıştırmaktadır.

Başlık dosyaları içeren kaynak dosyalarının başlık dosyaları her değiştiğinde yeniden derlenmesi gerekir. İlk sürümde başlık dosyasını yalnızca arayüzü değiştirmeniz gerekiyorsa değiştirirsiniz. İkinci sürümde, arayüzü veya uygulamayı değiştirmeniz gerekirse başlık dosyasını değiştirirsiniz.

Uygulama ayrıntılarını göstermemenizin yanı sıra , ikinci sürümle gereksiz yeniden derleme elde edeceksiniz .


1
+1 Profil oluşturucum başlık dosyalarına yerleştirilen kodu kullanmıyor - bu da değerli bir neden.
Eugene

Bu soruya cevabımı görürseniz programmers.stackexchange.com/questions/4573/… Bunun sınıfın anlambilimine ne kadar bağlı olduğunu, yani neyi kullanacağını göreceksiniz (özellikle de maruz kalan bir parçasıysa) kullanıcı arayüzünüz ve sisteminizdeki diğer sınıfların kaç tanesini doğrudan kullandığını).
CashCow

3

Bunu '93 -95'te ikinci şekilde yaptım. 5-10 işlev / dosya ile küçük bir uygulamayı yeniden derlemek için birkaç dakika sürdü (aynı 486 PC'de .. ve hayır, ya sınıfları da bilmiyordum, sadece 14-15 yaşındaydım ve internet yoktu ) .

Yani, yeni başlayanlara öğrettiğiniz ve profesyonelce kullandığınız şey, özellikle C ++ 'da oldukça farklı tekniklerdir.

C ++ ve bir F1 araba arasındaki karşılaştırmanın uygun olduğunu düşünüyorum. Yeni başlayanları bir F1 arabanın içine koymazsınız (motoru 80-95 derece santigrat dereceye kadar ısıtmazsanız bile başlamaz).

C ++ 'yı ilk dil olarak öğretmeyin. Seçenek 2'nin neden seçenek 1'den daha kötü olduğunu, statik derlemenin / bağlamanın ne anlama geldiğini ve böylece C ++ 'nın neden ilk yolu tercih ettiğini anlamanız için yeterince deneyimli olmalısınız.


Statik derleme / bağlantı üzerinde biraz ayrıntılı bilgi verdiyseniz bu cevap daha da iyi olurdu (o zaman bilmiyordum!)
Felix Dombek

2

İkinci yöntem, tamamen eğik bir sınıf dediğim şeydir. Bir sınıf tanımı yazıyorsunuz, ancak onu kullanan tüm kodlarınız sadece satır içi olacaktır.

Evet, derleyici ne zaman satır içi ve ne zaman satır içi olmayacağına karar verir ... Bu durumda derleyicinin bir karar vermesine yardımcı oluyorsunuz ve potansiyel olarak daha az kod üretme ve potansiyel olarak daha hızlı sonuç elde edeceksiniz.

Bu avantaj, bir işlevin uygulanmasını değiştirirseniz, onu kullanan tüm kaynağı yeniden oluşturmanız gerektiği gerçeğinden daha ağır basacaktır. Sınıfın hafif doğasında, uygulamayı değiştirmeyeceksiniz. Yeni bir yöntem eklerseniz, üstbilgiyi yine de değiştirmeniz gerekir.

Bununla birlikte, sınıfınız daha karmaşık hale geldiğinden, hatta bir döngü ekledikçe, bu şekilde yapmanın yararı azalır.

Özellikle de avantajları var:

  • Bu "ortak işlevsellik" kodu ise, üstbilgiyi ekleyebilir ve kaynağını içeren bir kitaplığa bağlanmak zorunda kalmadan birden çok projeden kullanabilirsiniz.

Satırlamanın dezavantajı, başlığınıza uygulama ayrıntılarını getirmeniz gerektiği anlamına gelir, yani fazladan başlıklar eklemeye başlamanız gerekir.

Uygulama ayrıntılarını eklemek zorunda olduğunuz için şablonların özel bir durum olduğunu unutmayın. Başka bir dosyada gizleyebilirsiniz, ancak orada olması gerekir. (Bu kuralın örneklerle bir istisnası vardır, ancak genel olarak şablonlarınızı satır içine alırsınız).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.