Rumah > pembangunan bahagian belakang > C++ > Mengapakah Saya Tidak Boleh Majukan Mengisytiharkan Kelas Bersarang dalam C?

Mengapakah Saya Tidak Boleh Majukan Mengisytiharkan Kelas Bersarang dalam C?

DDD
Lepaskan: 2024-12-27 12:42:10
asal
1050 orang telah melayarinya

Why Can't I Forward Declare Nested Classes in 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;
};
Salin selepas log masuk

Biasanya, anda boleh memajukan mengisytiharkan nama kelas menggunakan sintaks:

class A;
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini gagal untuk jenis bersarang. Pernyataan berikut akan mengakibatkan ralat penyusunan:

class C::D;
Salin selepas log masuk

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;
    ...
};
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan