Rumah >pembangunan bahagian belakang >C++ >Mengapakah Saya Tidak Boleh Majukan Mengisytiharkan Kelas Bersarang dalam C?
Pengisytiharan Hadapan Jenis/Kelas Bersarang dalam C
Dalam C , jenis dan kelas bersarang ialah ciri berguna untuk mengatur kod dan merangkum data . Walau bagaimanapun, pengisytiharan hadapan jenis bersarang memberikan cabaran unik.
Pertimbangkan senario berikut:
class A { public: typedef struct/class { ... } B; ... C::D *someField; }; class C { public: typedef struct/class { ... } D; ... A::B *someField; };
Biasanya, anda boleh memajukan mengisytiharkan nama kelas menggunakan sintaks:
class A;
Walau bagaimanapun, pendekatan ini gagal untuk jenis bersarang. Pernyataan berikut akan mengakibatkan ralat penyusunan:
class C::D;
Mengapa Pengisytiharan Hadapan Jenis Bersarang Adalah Mustahil
Ketidakupayaan untuk memajukan mengisytiharkan jenis bersarang adalah had dalam tatabahasa bahasa C. Ia berkaitan dengan cara pengkompil menghuraikan dan menyelesaikan pengisytiharan dan rujukan kelas.
Apabila pengisytiharan hadapan ditemui, pengkompil menyimpan pemegang tempat dalam ingatan untuk objek kelas. Walau bagaimanapun, untuk jenis bersarang, pengkompil tidak tahu di mana hendak meletakkan pemegang tempat ini kerana definisi kelas luar masih belum dihuraikan.
Penyelesaian
Malangnya, terdapat bukan penyelesaian langsung kepada masalah ini. Untuk mengatasinya, anda mesti menyahsarang sekurang-kurangnya satu daripada kelas bersarang. Sebagai contoh, anda boleh menyusun semula kod kepada yang berikut:
typedef struct/class Outer { ... Nested *someField; }; class Nested { ... }; class A { public: typedef Outer B; ... }; class C { public: typedef Outer D; ... };
Dengan menjadikan Outer sebagai jenis yang berasingan, anda kini boleh memajukan mengisytiharkan kedua-dua A::B dan C::D. Ini membolehkan kompilasi berjaya dan menyediakan fungsi yang diingini.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Majukan Mengisytiharkan Kelas Bersarang dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!