Faktanya, dalam C ++, ini agak lebih rumit daripada organisasi header / sumber C.
Apa yang dilihat kompilator?
Kompilator melihat satu file sumber besar (.cpp) dengan header yang disertakan dengan benar. File sumber adalah unit kompilasi yang akan dikompilasi menjadi file objek.
Jadi, mengapa header diperlukan?
Karena satu unit kompilasi mungkin memerlukan informasi tentang implementasi di unit kompilasi lain. Jadi seseorang dapat menulis misalnya implementasi suatu fungsi di satu sumber, dan menulis deklarasi fungsi ini di sumber lain yang perlu menggunakannya.
Dalam kasus ini, ada dua salinan dari informasi yang sama. Yang mana yang jahat ...
Solusinya adalah membagikan beberapa detail. Meskipun implementasinya harus tetap di Source, deklarasi simbol bersama, seperti fungsi, atau definisi struktur, kelas, enum, dll., Mungkin perlu dibagikan.
Header digunakan untuk meletakkan detail yang dibagikan tersebut.
Pindah ke tajuk deklarasi tentang apa yang perlu dibagikan antara berbagai sumber
Tidak ada lagi?
Di C ++, ada beberapa hal lain yang dapat diletakkan di header karena, mereka juga perlu dibagikan:
- kode sebaris
- template
- konstanta (biasanya yang ingin Anda gunakan di dalam sakelar ...)
Pindah ke tajuk SEMUANYA yang perlu dibagikan, termasuk penerapan bersama
Apakah itu berarti bahwa mungkin ada sumber di dalam tajuk?
Iya. Faktanya, ada banyak hal berbeda yang mungkin ada di dalam "header" (yaitu, dibagikan antar sumber).
- Deklarasi maju
- deklarasi / definisi fungsi / structs / class / template
- implementasi kode inline dan templated
Ini menjadi rumit, dan dalam beberapa kasus (ketergantungan melingkar antar simbol), tidak mungkin untuk menyimpannya dalam satu tajuk.
Header dapat dibagi menjadi tiga bagian
Artinya, dalam kasus ekstrem, Anda dapat memiliki:
- header deklarasi ke depan
- header deklarasi / definisi
- sebuah header implementasi
- sumber implementasi
Mari kita bayangkan kita memiliki MyObject template. Kami dapat memiliki:
// - - - - MyObject_forward.hpp - - - -
// This header is included by the code which need to know MyObject
// does exist, but nothing more.
template<typename T>
class MyObject ;
.
// - - - - MyObject_declaration.hpp - - - -
// This header is included by the code which need to know how
// MyObject is defined, but nothing more.
#include <MyObject_forward.hpp>
template<typename T>
class MyObject
{
public :
MyObject() ;
// Etc.
} ;
void doSomething() ;
.
// - - - - MyObject_implementation.hpp - - - -
// This header is included by the code which need to see
// the implementation of the methods/functions of MyObject,
// but nothing more.
#include <MyObject_declaration.hpp>
template<typename T>
MyObject<T>::MyObject()
{
doSomething() ;
}
// etc.
.
// - - - - MyObject_source.cpp - - - -
// This source will have implementation that does not need to
// be shared, which, for templated code, usually means nothing...
#include <MyObject_implementation.hpp>
void doSomething()
{
// etc.
} ;
// etc.
Wow!
Dalam "kehidupan nyata", biasanya tidak terlalu rumit. Kebanyakan kode hanya akan memiliki tajuk / organisasi sumber sederhana, dengan beberapa kode sebaris di sumbernya.
Tetapi dalam kasus lain (objek templated mengetahui satu sama lain), saya harus memiliki untuk setiap objek deklarasi terpisah dan header implementasi, dengan sumber kosong termasuk header tersebut hanya untuk membantu saya melihat beberapa kesalahan kompilasi.
Alasan lain untuk memecah tajuk menjadi tajuk yang terpisah bisa jadi untuk mempercepat kompilasi, membatasi jumlah simbol yang diuraikan hingga batas yang diperlukan, dan menghindari kompilasi ulang yang tidak perlu dari sumber yang hanya peduli pada deklarasi maju ketika penerapan metode sebaris berubah.
Kesimpulan
Anda harus membuat organisasi kode Anda sesederhana mungkin, dan sesederhana mungkin. Letakkan sebanyak mungkin di file sumber. Hanya tampilkan di header apa yang perlu dibagikan.
Tetapi jika Anda memiliki ketergantungan melingkar antara objek template, jangan heran jika organisasi kode Anda menjadi lebih "menarik" daripada organisasi header / sumber biasa ...
^ _ ^