C++ Academy · Pelajaran

Menyembunyikan Pelaksanaan dengan PIMPL

Sembunyikan butiran pelaksanaan di sebalik idiom penuding kepada pelaksanaan.

Pelajaran 3 daripada 415 langkah

Menyembunyikan Pelaksanaan dengan PIMPL ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Idiom PIMPL

PIMPL = "Penuding kepada Pelaksanaan." Pindahkan data persendirian kelas ke struktur Impl yang berasingan, yang dicapai melalui penuding.

Mengapa PIMPL?

Kelebihan:

  • Menyembunyikan butiran pelaksanaan daripada pengepala
  • Mengurangkan kebergantungan masa kompilasi
  • Mengekalkan kestabilan ABI apabila menambah ahli persendirian
  • Membolehkan pelaksanaan ditukar

Struktur Asas

Kelas awam memegang penuding ke struktur Impl yang ditakrifkan hanya dalam fail .cpp.

// widget.h
class Widget {
public:
    Widget();
    ~Widget();
    void doSomething();
private:
    struct Impl;
    std::unique_ptr<Impl> pimpl_;
};

Impl dalam .cpp

Struktur Impl menyimpan semua data sebenar.

// 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++;
}

Pemusnah dalam cpp

Pemusnah mesti ditakrifkan dalam .cpp apabila Impl lengkap. Jika tidak, unique_ptr tidak boleh memadam jenis yang tidak lengkap.

Fungsi Ahli Khas

Penyalinan, pemindahan dan penugasan juga mesti diisytiharkan secara eksplisit jika diperlukan. Versi yang dijana pengkompil tidak boleh berfungsi dengan jenis yang tidak lengkap dalam pengepala.

// widget.h
class Widget {
public:
    Widget(const Widget& other);
    Widget& operator=(const Widget& other);
    Widget(Widget&&) noexcept;
    Widget& operator=(Widget&&) noexcept;
    ~Widget();
};

Kos Prestasi

PIMPL menambah satu tahap pengalamatan tak langsung pada setiap capaian ahli dan satu peruntukan timbunan. Bagi kaedah yang kerap dipanggil, perkara ini boleh memberi kesan — lakukan pengukuran untuk memastikannya.

Binaan Lebih Pantas

Pengepala yang sebelum ini menyertakan jenis std atau kebergantungan berat kini boleh menjadi ringkas. Ubah .cpp tanpa mengkompil semula pengguna.

PIMPL dengan Pewarisan

PIMPL boleh digabungkan dengan pewarisan, tetapi ini menambah kerumitan. Kelas awam biasanya tidak mewarisi apa-apa; Impl boleh menggunakan pewarisan secara bebas.

Variasi

Alternatif dan penambahbaikan:

  • Fast PIMPL — storan sebaris dengan pembinaan pada lokasi
  • Alamat stabil — Impl kekal diperuntukkan sepanjang jangka hayat objek
  • Penghapusan jenis — Impl boleh menjadi polimorfik

Penggunaan Dunia Sebenar

PIMPL banyak digunakan oleh:

  • Qt (setiap widget ialah PIMPL)
  • Banyak pustaka proprietari
  • Boost (di sesetengah tempat)

Bila Menggunakan

Gunakan PIMPL apabila:

  • Anda mahukan kestabilan ABI merentas versi
  • Pengepala anda menyertakan terlalu banyak kebergantungan secara transitif
  • Anda mendedahkan antara muka pustaka awam

Bila Tidak Menggunakan

Jangan gunakan PIMPL apabila:

  • Kelas itu dalaman — tiada pengguna bergantung pada pengepala
  • Overhed prestasi lebih penting daripada masa binaan
  • Kelas itu kecil atau jarang diubah suai

Semakan Pantas

Mengapakah pemusnah kelas PIMPL mesti ditakrifkan dalam fail .cpp?

Rumusan

PIMPL menyembunyikan pelaksanaan dengan memindahkan data persendirian ke dalam struktur Impl yang dicapai melalui unique_ptr. Ia meningkatkan kestabilan ABI dan masa binaan dengan mengorbankan pengalamatan tak langsung. Takrifkan ahli khas dalam .cpp tempat Impl lengkap.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Menyembunyikan Pelaksanaan dengan PIMPL” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Menyembunyikan Pelaksanaan dengan PIMPL”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menyembunyikan Pelaksanaan dengan PIMPL”?

Sembunyikan butiran pelaksanaan di sebalik idiom penuding kepada pelaksanaan. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Menyembunyikan Pelaksanaan dengan PIMPL” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pustaka Pengepala Sahaja berbanding Pustaka Dikompil
  2. Penaiktarafan API dan Kestabilan ABI
  3. Menyembunyikan Pelaksanaan dengan PIMPL
  4. Menulis Pustaka Utiliti Pengepala Sahaja Moden
← Kembali ke C++ Academy