cari
Rumahpembangunan bahagian belakangC++Selesaikan masalah 'ralat: jenis tidak lengkap tidak dibenarkan' dalam kod C++

解决C++代码中出现的“error: incomplete type is not allowed”问题

Selesaikan masalah "ralat: jenis tidak lengkap tidak dibenarkan" dalam kod C++

Semasa proses pengaturcaraan C++, anda kadangkala menghadapi beberapa ralat kompilasi Salah satu ralat biasa ialah "ralat: jenis tidak lengkap tidak dibenarkan". Ralat ini biasanya disebabkan oleh operasi pada jenis yang tidak lengkap. Artikel ini akan menerangkan punca ralat ini dan menyediakan beberapa penyelesaian.

Mula-mula, mari lihat kod sampel yang menyebabkan ralat ini:

#include <iostream>

class A;
class B {
public:
    void foo(A& a) {
        std::cout << "foo function" << std::endl;
    }
};

class A {
public:
    void bar(B& b) {
        b.foo(*this);
    }
};

int main() {
    A a;
    B b;
    a.bar(b);
    return 0;
}

Dalam kod sampel ini, kami mentakrifkan dua kelas A dan B. Terdapat bar fungsi ahli dalam kelas A, dan jenis parameter fungsi ini ialah B Rujukan, dan terdapat fungsi ahli foo dalam kelas B, dan jenis parameter fungsi ini ialah rujukan A. Dalam fungsi utama, kami mencipta objek kelas A a dan objek kelas B b, dan kemudian memanggil fungsi bar a, melepasi b sebagai parameter.

Walau bagaimanapun, apabila kami cuba menyusun kod ini, kami akan mendapat mesej ralat berikut:

error: incomplete type 'A' used in nested name specifier

Ralat ini disebabkan oleh pengkompil tidak dapat menentukan definisi lengkap kelas A semasa menyusun kod ini. Memandangkan kewujudan kelas A hanya diisytiharkan apabila mentakrifkan kelas B, tetapi definisi lengkap kelas A tidak disediakan, pengkompil tidak dapat menentukan pelaksanaan khusus fungsi ahli dan pembolehubah ahli dalam kelas A, mengakibatkan ralat penyusunan.

Untuk menyelesaikan masalah ini, kami ada beberapa kaedah untuk dicuba.

Kaedah pertama ialah meletakkan definisi kelas sebelum tempat kelas ini digunakan. Kita boleh menukar takrif kelas B dengan takrif kelas A, seperti yang ditunjukkan di bawah:

class A {
public:
    void bar(B& b);
};

class B {
public:
    void foo(A& a) {
        std::cout << "foo function" << std::endl;
    }
};

void A::bar(B& b) {
    b.foo(*this);
}

Dengan meletakkan takrif kelas B sebelum takrif kelas A, pengkompil boleh mencari takrif lengkap kelas A, sekali gus menyelesaikan Penyusunan kesilapan.

Cara lain ialah menggunakan pengisytiharan hadapan. Kita boleh membuat pengisytiharan hadapan menggunakan kata kunci "kelas" sebelum pengisytiharan kelas, seperti yang ditunjukkan di bawah:

class A;
class B {
public:
    void foo(A& a) {
        std::cout << "foo function" << std::endl;
    }
};

class A {
public:
    void bar(B& b);
};

void A::bar(B& b) {
    b.foo(*this);
}

Dengan menggunakan pengisytiharan hadapan, kami memberitahu pengkompil bahawa kelas bernama A wujud, tetapi definisi khusus kelas Disediakan kemudian dalam kod. Dengan cara ini, pengkompil boleh mendapatkan maklumat kelas A melalui pengisytiharan hadapan, dengan itu menyelesaikan ralat penyusunan.

Kaedah terakhir ialah meletakkan definisi kelas dalam fail pengepala dan memasukkan fail pengepala dalam fail yang perlu menggunakan kelas ini. Sebagai contoh, kita boleh meletakkan takrif kelas A dan kelas B dalam dua fail pengepala "aclass.h" dan "bclass.h" masing-masing, dan kemudian masukkan fail pengepala yang sepadan dalam fail yang menggunakan kedua-dua kelas ini, seperti ditunjukkan di bawah :

Dalam fail "aclass.h":

#ifndef ACLASS_H
#define ACLASS_H

class B;

class A {
public:
    void bar(B& b);
};

#endif

Dalam fail "bclass.h":

#ifndef BCLASS_H
#define BCLASS_H

#include <iostream>
#include "aclass.h"

class B {
public:
    void foo(A& a) {
        std::cout << "foo function" << std::endl;
    }
};

#endif

Dalam fail yang menggunakan kedua-dua kelas ini, gunakan arahan #include untuk memasukkan fail pengepala yang sepadan dan gunakan ini Dua kelas, seperti yang ditunjukkan di bawah:

#include "aclass.h"
#include "bclass.h"

int main() {
    A a;
    B b;
    a.bar(b);
    return 0;
}

Dengan meletakkan takrif kelas dalam fail pengepala dan memasukkan fail pengepala yang sepadan dalam fail yang menggunakan kelas ini, kita boleh menggunakan dua kelas dengan betul dalam fail yang perlu menggunakannya . Gunakannya untuk menyelesaikan ralat kompilasi.

Ringkasnya, apabila kita menghadapi ralat "ralat: jenis tidak lengkap tidak dibenarkan" dalam kod C++, kita boleh meletakkan definisi kelas sebelum tempat di mana kelas ini digunakan, menggunakan pengisytiharan ke hadapan atau meletakkan kelas Letakkan definisi dalam fail pengepala untuk menyelesaikan masalah ini. Kaedah ini boleh membantu kami menggunakan jenis yang tidak lengkap dengan betul untuk mengelakkan ralat penyusunan ini.

Atas ialah kandungan terperinci Selesaikan masalah 'ralat: jenis tidak lengkap tidak dibenarkan' dalam kod 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
C# vs C: Sejarah, evolusi, dan prospek masa depanC# vs C: Sejarah, evolusi, dan prospek masa depanApr 19, 2025 am 12:07 AM

Sejarah dan evolusi C# dan C adalah unik, dan prospek masa depan juga berbeza. 1.C dicipta oleh BjarnestroustRup pada tahun 1983 untuk memperkenalkan pengaturcaraan berorientasikan objek ke dalam bahasa C. Proses evolusinya termasuk pelbagai standardisasi, seperti C 11 memperkenalkan kata kunci auto dan ekspresi Lambda, C 20 memperkenalkan konsep dan coroutin, dan akan memberi tumpuan kepada pengaturcaraan prestasi dan sistem pada masa akan datang. 2.C# telah dikeluarkan oleh Microsoft pada tahun 2000. Menggabungkan kelebihan C dan Java, evolusinya memberi tumpuan kepada kesederhanaan dan produktiviti. Sebagai contoh, C#2.0 memperkenalkan generik dan C#5.0 memperkenalkan pengaturcaraan tak segerak, yang akan memberi tumpuan kepada produktiviti pemaju dan pengkomputeran awan pada masa akan datang.

C# vs C: Lembaran Lelajaran dan Pengalaman PemajuC# vs C: Lembaran Lelajaran dan Pengalaman PemajuApr 18, 2025 am 12:13 AM

Terdapat perbezaan yang signifikan dalam lengkung pembelajaran C# dan C dan pengalaman pemaju. 1) Keluk pembelajaran C# agak rata dan sesuai untuk pembangunan pesat dan aplikasi peringkat perusahaan. 2) Keluk pembelajaran C adalah curam dan sesuai untuk senario kawalan berprestasi tinggi dan rendah.

C# vs C: Pengaturcaraan dan ciri berorientasikan objekC# vs C: Pengaturcaraan dan ciri berorientasikan objekApr 17, 2025 am 12:02 AM

Terdapat perbezaan yang signifikan dalam bagaimana C# dan C melaksanakan dan ciri-ciri dalam pengaturcaraan berorientasikan objek (OOP). 1) Definisi kelas dan sintaks C# lebih ringkas dan menyokong ciri -ciri canggih seperti LINQ. 2) C menyediakan kawalan berbutir yang lebih baik, sesuai untuk pengaturcaraan sistem dan keperluan prestasi tinggi. Kedua -duanya mempunyai kelebihan mereka sendiri, dan pilihannya harus berdasarkan senario aplikasi tertentu.

Dari XML ke C: Transformasi dan Manipulasi DataDari XML ke C: Transformasi dan Manipulasi DataApr 16, 2025 am 12:08 AM

Menukar dari XML ke C dan melakukan operasi data boleh dicapai melalui langkah -langkah berikut: 1) Parsing Fail XML menggunakan perpustakaan TinyXML2, 2) Pemetaan data ke dalam struktur data C, 3) Menggunakan perpustakaan standard C seperti STD :: Vektor untuk operasi data. Melalui langkah -langkah ini, data yang ditukar dari XML boleh diproses dan dimanipulasi dengan cekap.

C# vs C: Pengurusan memori dan koleksi sampahC# vs C: Pengurusan memori dan koleksi sampahApr 15, 2025 am 12:16 AM

C# menggunakan mekanisme pengumpulan sampah automatik, manakala C menggunakan pengurusan memori manual. 1. Pemungut Sampah C 2.C menyediakan kawalan memori yang fleksibel, sesuai untuk aplikasi yang memerlukan pengurusan yang baik, tetapi harus dikendalikan dengan berhati -hati untuk mengelakkan kebocoran ingatan.

Di luar gembar -gembur: Menilai kaitan C hari iniDi luar gembar -gembur: Menilai kaitan C hari iniApr 14, 2025 am 12:01 AM

C masih mempunyai kaitan penting dalam pengaturcaraan moden. 1) Keupayaan operasi prestasi tinggi dan perkakasan langsung menjadikannya pilihan pertama dalam bidang pembangunan permainan, sistem tertanam dan pengkomputeran berprestasi tinggi. 2) Paradigma pengaturcaraan yang kaya dan ciri -ciri moden seperti penunjuk pintar dan pengaturcaraan templat meningkatkan fleksibiliti dan kecekapannya. Walaupun lengkung pembelajaran curam, keupayaannya yang kuat menjadikannya masih penting dalam ekosistem pengaturcaraan hari ini.

Komuniti C: Sumber, Sokongan, dan PembangunanKomuniti C: Sumber, Sokongan, dan PembangunanApr 13, 2025 am 12:01 AM

C Pelajar dan pemaju boleh mendapatkan sumber dan sokongan dari StackOverflow, Komuniti R/CPP Reddit, Coursera dan EDX, Projek Sumber Terbuka di GitHub, Perkhidmatan Perundingan Profesional, dan CPPCON. 1. StackOverflow memberikan jawapan kepada soalan teknikal; 2. Komuniti R/CPP Reddit berkongsi berita terkini; 3. Coursera dan EDX menyediakan kursus f rasmi; 4. Projek sumber terbuka pada GitHub seperti LLVM dan meningkatkan kemahiran meningkatkan; 5. Perkhidmatan perundingan profesional seperti jetbrains dan perforce menyediakan sokongan teknikal; 6. CPPCON dan persidangan lain membantu kerjaya

C# vs C: di mana setiap bahasa cemerlangC# vs C: di mana setiap bahasa cemerlangApr 12, 2025 am 12:08 AM

C# sesuai untuk projek yang memerlukan kecekapan pembangunan tinggi dan sokongan silang platform, manakala C sesuai untuk aplikasi yang memerlukan prestasi tinggi dan kawalan asas. 1) C# Memudahkan pembangunan, menyediakan pengumpulan sampah dan perpustakaan kelas yang kaya, sesuai untuk aplikasi peringkat perusahaan. 2) C membolehkan operasi memori langsung, sesuai untuk pembangunan permainan dan pengkomputeran berprestasi tinggi.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)