Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: Ahli kelas mestilah jenis yang lengkap, bagaimana untuk menanganinya?

Ralat sintaks C++: Ahli kelas mestilah jenis yang lengkap, bagaimana untuk menanganinya?

WBOY
WBOYasal
2023-08-22 12:09:291162semak imbas

Ralat sintaks C++: Ahli kelas mestilah jenis yang lengkap, bagaimana untuk menanganinya?

Dalam pengaturcaraan C++, atur cara sering gagal untuk menyusun dengan betul disebabkan beberapa ralat mudah. Salah satu kesilapan yang lebih biasa ialah ahli kelas mestilah jenis yang lengkap. Mesej ralat ini menunjukkan bahawa apabila mentakrifkan pembolehubah ahli kelas atau fungsi ahli, jenis data yang digunakan bukanlah jenis yang lengkap, menyebabkan pengkompil tidak dapat mengenali jenis data ahli kelas.

Ralat jenis ini boleh berlaku sekiranya rujukan silang antara kelas. Sebagai contoh, kelas A perlu merujuk kelas B, tetapi kelas B belum ditakrifkan sebelum kelas A diisytiharkan Pada masa ini, ralat ini mungkin berlaku apabila pembolehubah ahli atau fungsi ahli yang ditakrifkan dalam kelas A melibatkan kelas B.

Jadi bagaimanakah ralat ini harus dikendalikan? Di bawah saya akan menyediakan dua penyelesaian yang mungkin:

Kaedah 1: Kelas pra-diisytiharkan

Kaedah ini adalah penyelesaian yang agak mudah dan berkesan. Apabila menentukan kelas A, kelas B boleh diisytiharkan terlebih dahulu di luar kelas. Dengan cara ini, apabila kelas B digunakan dalam kelas A, pengkompil boleh mengenali jenis ini. Pelaksanaan kod adalah seperti berikut:

class B; //提前声明类B

class A {
    private:
        B* b_ptr;
    public:
        void foo();
};

class B {
    private:
        int b_var;
    public:
        void bar();
};

void A::foo() {
    b_ptr = new B;
}

void B::bar() {
    b_var = 10;
}

int main() {
    A a_obj;
    a_obj.foo();
    return 0;
}

Dalam kod di atas, kelas B terlebih dahulu diisytiharkan sebelum kelas A. Dengan cara ini, kelas B boleh digunakan secara normal apabila mentakrifkan kelas A. Dalam kelas A, penunjuk b_ptr yang menunjuk ke kelas B ditakrifkan, dan penunjuk diberikan nilai melalui fungsi ahli foo(). Pada masa yang sama, kelas B juga mentakrifkan pembolehubah ahlinya sendiri dan fungsi ahli secara normal, dan memberikan nilai kepada pembolehubah ahli b_var melalui bar fungsi ahli (). Akhir sekali, contoh a_obj kelas A dicipta dalam fungsi utama dan fungsi ahli foo() dipanggil. Program ini boleh disusun dan dijalankan dengan betul, dan mesej ralat "Ahli kelas mesti jenis lengkap" tidak lagi muncul.

Kaedah 2: Gunakan penunjuk atau rujukan dan bukannya objek

Jika anda perlu mengakses pembolehubah ahli atau fungsi ahli dalam kelas lain dalam kelas, tetapi tidak boleh meletakkan definisi kelas pada permulaan, maka kaedah ini boleh digunakan. Dalam kes ini, anda boleh menghantar penunjuk atau rujukan kepada objek dan bukannya objek itu sendiri. Ini juga mengelakkan ralat "ahli kelas mesti jenis lengkap". Kod tersebut dilaksanakan seperti berikut:

class B; //提前声明类B

class A {
    private:
        B* b_ptr;
    public:
        void foo();
};

class B {
    private:
        int b_var;
    public:
        void bar();
};

void A::foo() {
    b_ptr = new B;
    b_ptr -> bar();
}

void B::bar() {
    b_var = 10;
}

int main() {
    A a_obj;
    a_obj.foo();
    return 0;
}

Di sini, takrif kelas A dan kelas B masih tidak berubah, tetapi dalam fungsi foo, kami memanggil bar fungsi ahli () dalam kelas B dengan beroperasi pada penunjuk b_ptr kelas B. Pada masa yang sama, dalam kelas B, skema yang sama digunakan untuk mengakses pembolehubah ahli b_var.

Dua kaedah adalah berbeza, dan pelan khusus boleh dipilih mengikut keperluan dan situasi anda. Tetapi secara umum, penyelesaian ini boleh mengelakkan ralat penyusunan yang disebabkan oleh "ahli kelas mesti jenis lengkap". Semoga artikel ini bermanfaat kepada anda.

Atas ialah kandungan terperinci Ralat sintaks C++: Ahli kelas mestilah jenis yang lengkap, bagaimana untuk menanganinya?. 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