Saya selalu bingung tentang file header. Mereka sangat aneh: Anda memasukkan file .h yang tidak termasuk .cpp tetapi .cpp entah bagaimana dikompilasi juga.
Baru-baru ini saya bergabung dengan proyek tim, dan tentu saja, keduanya .h dan .cpp digunakan.
Saya mengerti bahwa ini sangat penting, tapi saya tidak bisa hidup dengan copy-paste setiap deklarasi fungsi di masing-masing beberapa kelas yang kita miliki.
Bagaimana cara menangani konvensi 2-file secara efisien?
Apakah ada alat untuk membantu dengan itu, atau secara otomatis mengubah satu file yang terlihat seperti contoh di bawah ini menjadi .h dan .cpp? (khusus untuk MS VC ++ 2010)
class A
{
...
Type f(Type a,Type b)
{
//implementation here, not in another file!
}
...
};
Type f(Type a)
{
//implementation here
}
...
c++
language-design
naming
Oleh Prypin
sumber
sumber
Jawaban:
Menulis Lebih Ramah Refactoring C ++
Di C ++ Anda tidak harus menggunakan header sama sekali. Anda dapat mendefinisikan seluruh objek dalam satu file seperti yang Anda lakukan dengan C # atau Java. Pengembang C umumnya hanya akan menyimpan panggilan eksternal dalam file header. Semua panggilan internal akan ditentukan dalam file .c. Dengan cara yang sama, Anda dapat memesan file C ++ .h untuk kelas / antarmuka (kelas abstrak virtual murni) / etc. yang dimaksudkan untuk dibagikan di luar DLL. Untuk kelas / struct / antarmuka internal, dll. Anda cukup menyertakan file .cpp yang Anda butuhkan:
Ini sepertinya bukan pendekatan yang paling populer, tetapi ini legal C ++. Pasti akan menjadi kemungkinan untuk semua kode internal Anda. Ini memungkinkan kode internal dan sekumpulan kelas untuk berubah lebih banyak secara radikal sambil menyediakan antarmuka yang lebih stabil untuk kode di luar perpustakaan Anda / yang dapat dieksekusi untuk berinteraksi.
Memiliki seluruh kelas Anda di dalam satu file akan membuatnya lebih mudah untuk melakukan apa yang Anda inginkan. Itu tidak akan menyelesaikan masalah penggantian nama metode dan harus mencari ke setiap tempat metode itu dipanggil, tetapi itu akan memastikan Anda memiliki pesan kesalahan yang lebih dapat dipahami. Tidak ada yang lebih buruk daripada memiliki header Anda mendeklarasikan metode satu arah, tetapi Anda menerapkannya secara berbeda. Kode lain yang memanggil file header akan dikompilasi dengan benar dan Anda akan mendapatkan pengecualian tautan, sementara file implementasi akan menjadi salah satu yang mengeluh bahwa metode itu tidak didefinisikan. Ketika Anda mendefinisikan setiap metode di tempat (dalam deklarasi kelas yang sebenarnya), Anda akan mendapatkan pesan kesalahan yang sama tidak peduli file apa yang menyertakannya.
Anda mungkin juga ingin melihat pertanyaan ini: Alat refactoring yang bagus untuk C ++
Bagaimana C / C ++ Menyelesaikan File Header / Implementasi
Pada level C dasar (dan C ++ dibangun di atas fondasi itu), file header menyatakan janji fungsi / struct / variabel yang cukup untuk memungkinkan kompiler membuat file objek. Demikian pula file header C ++ menyatakan janji fungsi, struct, kelas, dll. Ini adalah definisi yang digunakan kompilator untuk memesan ruang di stack, dll.
File .c atau .cpp memiliki implementasinya. Ketika kompiler mengonversi setiap file implementasi ke file objek, ada kait ke konsep yang tidak diterapkan (apa yang dinyatakan dalam header). Tautan mengikat kait ke implementasi di file objek lain dan membuat biner yang lebih besar yang mencakup semua kode (shared library atau executable).
VS Spesifik
Untuk bekerja dengan orang-orang di Visual Studio, ada beberapa penyihir yang membantu membuat segalanya lebih mudah. Wizard kelas baru akan membuat pasangan header dan file implementasi yang cocok. Bahkan ada fitur browser kelas yang akan memungkinkan Anda mendeklarasikan metode baru. Ini akan menyuntikkan definisi di header dan rintisan implementasi dalam file .cpp. Visual Studio telah memiliki fitur-fitur tersebut selama lebih dari satu dekade (selama saya telah menggunakannya).
sumber
Menjadi pengembang Java.
Jika Anda benar-benar harus terus mengembangkan C ++, Anda dapat mencoba menggunakan IDE. Seringkali mereka menawarkan beberapa mekanisme di mana Anda dapat menambahkan metode ke kelas, dan itu secara otomatis menempatkan deklarasi dalam file .h dan definisi dalam file .cpp.
sumber
Anda bisa tertarik pada makeheaders program dari Hwaci (orang-orang yang SQLite dan Fosil).
Lihat juga bagaimana fosil dibangun untuk memiliki ide.
sumber
Ketika Anda menulis baris pertama dari sebuah kelas baru, biasanya itu karena Anda membutuhkannya di satu tempat hanya pada waktu itu. Di lain waktu, mungkin digunakan di lebih banyak tempat, tetapi pada awalnya biasanya tidak.
Banyak kelas saya mulai di bagian atas file .cpp saat ini. Ketika sudah cukup stabil untuk menggunakannya di banyak tempat, saya potong-tempel ke header. Meskipun seringkali kelasnya menghilang secepat itu muncul.
sumber
Sebagai saran untuk membantu menangani file header C ++, biasanya digunakan tanpa ekstensi file atau akhiran file, seperti yang dilakukan oleh pustaka "GCC".
Jika ini adalah kasus Anda, saya sarankan untuk menggunakan ekstensi file atau akhiran file " .hpp" (atau unleast " .hxx").
Anda mungkin harus mengonfigurasi kompiler, lingkungan pengembang, atau program Bangun.
sumber
#include <iostream>
? Itu bukan hanya untuk perpustakaan GCC. Bahkan, itu didefinisikan dalam standar C ++ 1997 , bagian 17.3.1.2. Saya akan menghindari penamaan file seperti itu. Anda bisa, tetapi alasan pustaka standar C ++ melakukan itu mungkin untuk menghindari konflik penamaan. Saya benar-benar merasa aneh ketika kompiler secara otomatis menambahkan '.h' ketika Anda memasukkan header, sepertinya cukup tidak standar bagi saya. Dan saya tidak pernah melihat header nama siapa pun tanpa akhiran kecuali untuk pustaka standar c ++.#include <someclass>
dibaca seperti#include <someclass.hpp>
pada semua kompiler. Kode Anda akan rusak.