Saya bingung bagaimana memisahkan implementasi dan deklarasi kode dari kelas sederhana menjadi file header dan cpp baru. Sebagai contoh, bagaimana saya memisahkan kode untuk kelas berikut?
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
public:
anggota di atas dapat banyak mempengaruhi , jika pengguna memindahkan mereka sesuai dengan saran ini - tetapi telah memesan ketergantungan antar anggota dan belum menyadari bahwa anggota diinisialisasi dalam urutan deklarasi mereka ;-)Jawaban:
Deklarasi kelas masuk ke file header. Penting bahwa Anda menambahkan
#ifndef
penjaga sertakan, atau jika Anda menggunakan platform MS, Anda juga dapat menggunakannya#pragma once
. Saya juga telah menghapus privat, secara default anggota kelas C ++ bersifat privat.dan implementasinya ada di file CPP:
sumber
#ifndef
barang di header?Secara umum .h Anda berisi definisi kelas, yang merupakan semua data Anda dan semua deklarasi metode Anda. Seperti ini dalam kasus Anda:
Dan .cpp Anda berisi implementasi metode seperti ini:
sumber
Penting untuk menunjukkan kepada pembaca yang tersandung pada pertanyaan ini ketika meneliti subjek dengan cara yang lebih luas bahwa prosedur jawaban yang diterima tidak diperlukan jika Anda hanya ingin membagi proyek Anda menjadi file. Ini hanya diperlukan ketika Anda membutuhkan beberapa implementasi dari satu kelas. Jika implementasi Anda per kelas adalah satu, cukup satu file header untuk masing-masing sudah cukup.
Karenanya, dari contoh jawaban yang diterima hanya bagian ini yang diperlukan:
Definisi preprocessor #ifndef dll. Memungkinkan untuk digunakan beberapa kali.
PS. Topiknya menjadi lebih jelas setelah Anda menyadari C / C ++ 'bodoh' dan #include hanyalah cara untuk mengatakan "buang teks ini di tempat ini".
sumber
.cpp
, atau hanya.h
benar-benar "baik" untuk metode kode organisasi ini?Pada dasarnya sintaks modifikasi deklarasi fungsi / definisi:
a2dd.h
a2dd.cpp
sumber
A2DD.h
A2DD.cpp
Idenya adalah untuk menyimpan semua tanda tangan fungsi dan anggota dalam file header.
Ini akan memungkinkan file proyek lainnya untuk melihat bagaimana kelas terlihat tanpa harus mengetahui implementasinya.
Dan di samping itu, Anda kemudian dapat memasukkan file header lainnya dalam implementasi bukan header. Ini penting karena header mana pun yang termasuk dalam file header Anda akan dimasukkan (diwariskan) dalam file lain yang menyertakan file header Anda.
sumber
Anda meninggalkan deklarasi di file header:
Dan letakkan definisi dalam file implementasi.
Anda dapat menggabungkan keduanya (biarkan
getSum()
definisi di header misalnya). Ini berguna karena memberi kompiler kesempatan yang lebih baik untuk inlining misalnya. Tetapi itu juga berarti bahwa mengubah implementasi (jika dibiarkan di header) dapat memicu pembangunan kembali semua file lain yang termasuk header.Perhatikan bahwa untuk template, Anda harus menyimpan semuanya di header.
sumber
Biasanya Anda hanya menempatkan deklarasi dan fungsi inline yang sangat singkat di file header:
Misalnya:
sumber
Saya tidak akan merujuk contoh Anda terlalu sederhana untuk jawaban umum (misalnya tidak mengandung fungsi templated, yang memaksa Anda untuk mengimplementasikannya di header), apa yang saya ikuti sebagai aturan praktis adalah pimpl idiom
Ini memiliki beberapa manfaat karena Anda mendapatkan waktu kompilasi lebih cepat dan gula sintaksis:
class->member
dari padaclass.member
Satu-satunya kelemahan adalah pointer ekstra yang Anda bayar.
sumber