it-swarm-id.com

Apa yang harus saya lakukan jika saya benci file header C ++?

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 dari 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
}
...
25
Oleh Prypin

Anda dapat menggunakan Lzz . Ini adalah alat baris perintah yang mengambil deklarasi yang ditulis dalam sintaks C++ dan menghasilkan file header dan sumber.

3
Mario Becerra

Menulis Lebih Ramah Refactoring C++

Di C++ Anda tidak memiliki untuk 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 Anda untuk kelas/antarmuka (kelas abstrak virtual murni)/etc. yang dimaksudkan untuk dibagikan di luar DLL. Untuk kelas internal/struct/antarmuka, dll. Anda cukup memasukkan file .cpp yang Anda butuhkan:

#include<myclass.cpp>

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 berubah lebih banyak secara radikal sambil memberikan 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 memecahkan 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 dasar C (dan C++ dibangun di atas fondasi itu), file header menyatakan janji dari fungsi/struct/variabel yang cukup untuk memungkinkan kompiler untuk 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. Panduan kelas baru akan membuat pasangan Anda yang cocok dari header dan file implementasi. 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).

16
Berin Loritsch

Menjadi Java pengembang.

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.

13
Paul Butcher

Anda bisa tertarik pada program makeheaders dari Hwaci (mereka yang melakukan SQLite dan Fossil).

Lihat juga bagaimana Fossil dibangun untuk memiliki ide.

8
Benoit

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.

5
Sjoerd

File Header (.h) menjelaskan antarmuka ke kode, karena itulah hanya sedikit itu lainnya kode dapat dilihat.

File Source (.cpp) menyediakan implementasi kode yang tidak perlu diketahui orang lain.

anda memasukkan file .h yang tidak termasuk .cpp ...

Benar.

Sebagai konsumen kode ini, Anda hanya perlu file Header sehingga kompiler tahu apa yang tersedia dalam kode itu untuk Anda kerjakan. Kode sumber C++ tidak digunakan dengan cara apa pun, bentuk atau bentuk pada titik ini (atau, setidaknya, itu tidak seharusnya menjadi).

... tapi .cpp entah bagaimana dikompilasi juga.

Ya itu, tetapi sepenuhnya terpisah.

File .cpp dari modul/perpustakaan yang Anda gunakan dikompilasi ke dalam file Object (.o/.dll) oleh Pengembang perpustakaan itu. File objek itu akan berisi titik masuk yang "bentuk" sama dengan yang dijelaskan dalam file Header.

Anda akan memerlukan file Objek itu ketika Anda datang ke tautan selesai Anda dieksekusi, pada titik mana Linker dapat mengambil konten file Obyek dan menanamkannya ke dalam executable Anda (itu untuk penghubungan statis; penghubungan dinamis mendapat lebih rumit)
Pada dasarnya linker harus "bergabung dengan titik-titik" antara titik-titik entri yang kode Anda harapkan untuk dapat memanggil, berdasarkan apa yang dilihatnya dalam file Header, dan apa yang sebenarnya ada di perpustakaan itu sendiri).

0
Phill W.