Menyembunyikan Implementasi dengan PIMPL
Sembunyikan detail implementasi di balik idiom pointer-to-implementation
Menyembunyikan Implementasi dengan PIMPL adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Idiom PIMPL
PIMPL = "Penunjuk ke Implementasi." Pindahkan data privat kelas ke struct impl terpisah yang diakses melalui penunjuk.
Mengapa PIMPL?
Manfaat:
- Menyembunyikan detail implementasi dari header
- Mengurangi dependensi waktu kompilasi
- Mempertahankan kestabilan ABI saat menambahkan anggota privat
- Memungkinkan penggantian implementasi
Struktur Dasar
Kelas publik menyimpan penunjuk ke struct Impl yang hanya didefinisikan di berkas .cpp.
// widget.h
class Widget {
public:
Widget();
~Widget();
void doSomething();
private:
struct Impl;
std::unique_ptr<Impl> pimpl_;
};Impl di dalam .cpp
Struct Impl menyimpan semua data sebenarnya.
// widget.cpp
struct Widget::Impl {
std::string name;
int counter;
// ... anything else, freely
};
Widget::Widget()
: pimpl_(std::make_unique<Impl>()) {}
Widget::~Widget() = default; // must be in .cpp where Impl is complete
void Widget::doSomething() {
pimpl_->counter++;
}Destruktor di Berkas Implementasi
Destruktor harus didefinisikan di dalam .cpp tempat Impl sudah lengkap. Jika tidak, unique_ptr tidak dapat menghapus tipe yang belum lengkap.
Fungsi Anggota Khusus
Operasi salin, pindah, dan penugasan juga harus dideklarasikan secara eksplisit jika diperlukan. Versi yang dihasilkan kompiler tidak dapat bekerja dengan tipe yang belum lengkap di dalam header.
// widget.h
class Widget {
public:
Widget(const Widget& other);
Widget& operator=(const Widget& other);
Widget(Widget&&) noexcept;
Widget& operator=(Widget&&) noexcept;
~Widget();
};Biaya Kinerja
PIMPL menambahkan satu tingkat indireksi pada setiap akses anggota dan satu alokasi heap. Untuk metode yang sering dipanggil, hal ini dapat berpengaruh — ukurlah untuk memastikannya.
Pembangunan yang Lebih Cepat
Header yang sebelumnya menyertakan tipe std atau dependensi mahal kini dapat dibuat ringkas. Perubahan pada berkas implementasi tidak memerlukan kompilasi ulang pengguna.
PIMPL dengan Pewarisan
PIMPL dapat digabungkan dengan pewarisan, tetapi menambah kerumitan. Kelas publik biasanya tidak mewarisi apa pun; Impl dapat menggunakan pewarisan dengan bebas.
Variasi
Alternatif dan penyempurnaan:
- PIMPL Cepat — penyimpanan inline dengan placement new
- Alamat Stabil — Impl tetap dialokasikan selama masa hidup objek
- Penghapusan Tipe — Impl dapat bersifat polimorfik
Penggunaan di Dunia Nyata
PIMPL banyak digunakan oleh:
- Qt (setiap Widget menggunakan PIMPL)
- Banyak pustaka proprietari
- Boost (di beberapa tempat)
Kapan Menggunakan
Gunakan PIMPL jika:
- Anda menginginkan kestabilan ABI lintas versi
- Header Anda secara transitif menyertakan terlalu banyak hal
- Anda mengekspos API pustaka publik
Kapan Melewati
Lewati PIMPL jika:
- Kelasnya bersifat internal — tidak ada pengguna yang bergantung pada header tersebut
- Overhead kinerja lebih penting daripada waktu pembangunan
- Kelasnya kecil atau jarang diubah
Pemeriksaan Singkat
Mengapa destruktor kelas PIMPL harus didefinisikan di dalam berkas .cpp?
Ringkasan
PIMPL menyembunyikan implementasi dengan memindahkan data privat ke struct Impl yang diakses melalui unique_ptr. PIMPL meningkatkan kestabilan ABI dan waktu pembangunan dengan mengorbankan satu tingkat indireksi. Definisikan anggota khusus di dalam .cpp tempat Impl sudah lengkap.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menyembunyikan Implementasi dengan PIMPL” gratis?
Ya — teks lengkap “Menyembunyikan Implementasi dengan PIMPL” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menyembunyikan Implementasi dengan PIMPL”?
Sembunyikan detail implementasi di balik idiom pointer-to-implementation Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Menyembunyikan Implementasi dengan PIMPL” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pustaka Hanya-Header vs Terkompilasi
- Pembuatan Versi API dan Stabilitas ABI
- Menyembunyikan Implementasi dengan PIMPL
- Menulis Pustaka Utilitas Hanya-Header Modern