Variabel pribadi adalah cara untuk menyembunyikan kerumitan dan detail implementasi kepada pengguna kelas. Ini adalah fitur yang agak bagus. Tapi saya tidak mengerti mengapa di c ++ kita harus meletakkannya di header sebuah kelas. Saya melihat dua kelemahan yang mengganggu ini:
- Itu mengacaukan header dari pengguna
- Ini memaksa kompilasi ulang semua perpustakaan klien setiap kali internal diubah
Apakah ada alasan konseptual di balik persyaratan ini? Apakah hanya untuk memudahkan pekerjaan di luar kompiler?
struct foo{};
) tidak diperbolehkan, tetapi meneruskan deklarasi (struct foo;
) adalah.Jawaban:
Itu karena kompiler C ++ harus mengetahui ukuran sebenarnya dari kelas untuk mengalokasikan jumlah memori yang tepat pada instantiasi. Dan ukurannya mencakup semua anggota, juga yang pribadi.
Salah satu cara untuk menghindari hal ini adalah dengan menggunakan idiom Pimpl , yang dijelaskan oleh Herb Sutter dalam seri # 24 dan # 28 dari Guru of the Week .
Memperbarui
Memang, ini (atau lebih umum, perbedaan /
#include
s file sumber file dan s) adalah rintangan utama dalam C ++, diwarisi dari C. Kembali pada hari-hariC ++C dibuat, belum ada pengalaman dengan pengembangan perangkat lunak skala besar, di mana ini mulai menimbulkan masalah nyata. Pelajaran yang dipetik sejak saat itu diperhatikan oleh perancang bahasa yang lebih baru, tetapi C ++ terikat oleh persyaratan kompatibilitas ke belakang, membuatnya sangat sulit untuk mengatasi masalah mendasar dalam bahasa tersebut.sumber
private
lebih modern.Definisi kelas harus cukup bagi kompiler untuk menghasilkan tata letak yang identik dalam memori di mana pun Anda telah menggunakan objek kelas. Misalnya, diberikan sesuatu seperti:
Kompiler biasanya memiliki
a
offset 0, danb
offset4
. Jika kompilator melihat ini hanya sebagai:Itu akan "berpikir" yang
b
harus diimbangi 0 bukannya diimbangi 4. Ketika kode menggunakan definisi yang ditugaskanb
, kode menggunakan definisi pertama akan melihata
bisa dimodifikasi, dan sebaliknya.Cara biasa untuk meminimalkan efek membuat perubahan pada bagian pribadi kelas biasanya disebut idiom pimpl (yang saya yakin Google dapat memberikan banyak informasi).
sumber
Kemungkinan besar ada beberapa alasan. Sementara anggota pribadi tidak dapat diakses oleh sebagian besar kelas lain, mereka masih dapat diakses oleh kelas teman. Jadi setidaknya dalam hal ini mereka mungkin diperlukan di header, sehingga kelas teman dapat melihat keberadaannya.
Kompilasi file dependen mungkin tergantung pada struktur include Anda. Termasuk file .h dalam file .cpp sebagai ganti header lain dalam beberapa kasus dapat mencegah rantai panjang kompilasi ulang.
sumber