


Selesaikan masalah 'ralat: jenis tidak lengkap tidak dibenarkan' dalam kod C++
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP ialah bahasa pembangunan web popular yang telah digunakan sejak sekian lama. Kelas PDO (Objek Data PHP) yang disepadukan dalam PHP adalah cara biasa untuk kita berinteraksi dengan pangkalan data semasa pembangunan aplikasi web. Walau bagaimanapun, masalah yang sering dihadapi oleh sesetengah pembangun PHP ialah apabila menggunakan kelas PDO untuk berinteraksi dengan pangkalan data, mereka menerima ralat seperti ini: PHPFatalerror:CalltoundefinedmethodPDO::prep

Sangat biasa untuk menggunakan axios dalam aplikasi Vue ialah klien HTTP berasaskan Promise yang boleh digunakan dalam penyemak imbas dan Node.js. Semasa proses pembangunan, mesej ralat "Uncaught(inpromise)Error: Requestfailedwithstatuscode500" kadangkala muncul untuk pembangun, mesej ralat ini mungkin sukar difahami dan diselesaikan. Artikel ini akan meneroka perkara ini

Selesaikan masalah "error:incompletetypeisnotallowed" dalam kod C++ Semasa proses pengaturcaraan C++, anda kadangkala menghadapi beberapa ralat kompilasi Salah satu ralat biasa ialah "error:incompletetypeisnotallowed". Ralat ini biasanya disebabkan oleh operasi pada jenis yang tidak lengkap. Artikel ini akan menerangkan punca ralat ini dan menyediakan beberapa penyelesaian. Pertama sekali, saya

Penyelesaian kepada "0271: ralat jam masa nyata" yang tidak boleh dihidupkan: 1. Tekan F1, dan dalam antara muka yang muncul, alihkan bar pilihan ke item ketiga "Tarikh/Masa" 2. Tukar masa sistem secara manual ke masa semasa; 3. Tekan F10 dan pilih ya dalam kotak dialog pop timbul 4. Buka semula buku nota untuk but seperti biasa.

Selesaikan masalah "error:expectedinitializerbefore'datatype'" dalam kod C++ Dalam pengaturcaraan C++, kadangkala kita menghadapi beberapa ralat kompilasi semasa menulis kod. Ralat ini biasanya berlaku dalam pengisytiharan berubah atau definisi fungsi dan boleh menyebabkan atur cara gagal untuk menyusun dengan betul atau

Bagaimana untuk melakukan pengesahan data pada kod C++? Pengesahan data adalah bahagian yang sangat penting semasa menulis kod C++. Dengan mengesahkan data yang dimasukkan oleh pengguna, keteguhan dan keselamatan program boleh dipertingkatkan. Artikel ini akan memperkenalkan beberapa kaedah dan teknik pengesahan data biasa untuk membantu pembaca mengesahkan data dalam kod C++ dengan berkesan. Semakan jenis data input Sebelum memproses input data oleh pengguna, semak dahulu sama ada jenis data input memenuhi keperluan. Sebagai contoh, jika anda perlu menerima input integer daripada pengguna, anda perlu memastikan bahawa input pengguna adalah

Bagaimana untuk menyelesaikan PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory Dalam proses menggunakan pembangunan PHP, kita sering menghadapi beberapa masalah pengendalian fail, salah satunya ialah "PHPWarning:fopen():failedtoopenstream:Nosuchfileordirectory"

Apabila menulis aplikasi web menggunakan PHP, pangkalan data MySQL sering digunakan untuk menyimpan data. PHP menyediakan cara untuk berinteraksi dengan pangkalan data MySQL yang dipanggil MySQLi. Walau bagaimanapun, kadangkala apabila menggunakan MySQLi, anda akan menemui mesej ralat, seperti yang ditunjukkan di bawah: PHPFatalerror:Calltoundefinedfunctionmysqli_connect() Mesej ralat ini bermakna PHP tidak dapat mencari saya
