Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Mengisytiharkan Ahli Kelas Jenis Yang Sama Menyebabkan Ralat \"Jenis Tidak Lengkap\" dalam C ?

Mengapa Mengisytiharkan Ahli Kelas Jenis Yang Sama Menyebabkan Ralat \"Jenis Tidak Lengkap\" dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-11-19 06:20:02122semak imbas

Why Does Declaring a Class Member of the Same Type Cause an

Memahami Jenis Tidak Lengkap dalam Kelas

Dalam C , mengisytiharkan ahli kelas daripada jenis yang sama dengan kelas itu sendiri boleh membawa kepada "tidak lengkap ralat taip". Pertimbangkan contoh berikut:

class A {
    private:
        A member;
};

Mengapa kod ini gagal disusun?

Alasannya terletak pada susunan pengisytiharan dan definisi. Apabila ahli ahli A diisytiharkan dalam kelas, pengkompil belum mentakrifkan kelas A sepenuhnya. Akibatnya, jenis A tidak lengkap.

Walau bagaimanapun, jika penunjuk kepada kelas digunakan sebaliknya, pengkompil boleh mengecam A* sebagai "penunjuk kepada jenis A" walaupun A tidak ditakrifkan sepenuhnya. Ini kerana pengkompil mengetahui bahawa penuding adalah jenis yang sah.

Untuk menyelesaikan ralat "jenis tidak lengkap", satu penyelesaian ialah menggunakan penunjuk pintar, seperti boost::shared_ptr ahli, untuk mewakili rujukan ahli. Penunjuk pintar boleh mengurus memori secara automatik dan mengelakkan kerumitan pengendalian penunjuk manual.

Pendekatan lain ialah mengisytiharkan hadapan kelas dalam perisytiharan ahli, seperti:

class A;

class A {
    private:
        A* member;
};

Ini membolehkan pengkompil untuk mengetahui bahawa A ialah jenis kelas yang sah, walaupun ia belum ditakrifkan sepenuhnya.

Memahami jenis yang tidak lengkap adalah penting dalam pengaturcaraan C, kerana ia mempengaruhi susunan kelas dan ahlinya ditakrifkan . Penunjuk atau penunjuk pintar boleh digunakan sebagai penyelesaian apabila berurusan dengan ahli jenis rekursif.

Atas ialah kandungan terperinci Mengapa Mengisytiharkan Ahli Kelas Jenis Yang Sama Menyebabkan Ralat \"Jenis Tidak Lengkap\" dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn