Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: Panggilan pembina kelas asas tidak betul, bagaimana untuk menanganinya?

Ralat sintaks C++: Panggilan pembina kelas asas tidak betul, bagaimana untuk menanganinya?

王林
王林asal
2023-08-21 21:16:451627semak imbas

Ralat sintaks C++: Panggilan pembina kelas asas tidak betul, bagaimana untuk menanganinya?

Dalam pengaturcaraan C++, kita sering menghadapi situasi di mana pembina kelas asas dipanggil. Walau bagaimanapun, semasa proses ini, kadangkala pembina kelas asas dipanggil secara tidak betul. Keadaan ini sering mengakibatkan program keluar secara tidak normal atau menyebabkan ralat yang tidak diketahui. Jika anda menghadapi situasi ini, jangan panik Artikel ini akan memberi anda pengenalan terperinci kepada panggilan pembina kelas asas yang salah dan cara menanganinya.

1. Panggilan pembina kelas asas yang salah

Dalam C++, pembina kelas terbitan mesti memanggil pembina kelas asasnya untuk memastikan semua ahli kelas asas dimulakan dengan betul. Secara umumnya, memanggil pembina kelas asas dalam senarai permulaan ahli bagi pembina kelas terbitan ialah kaedah yang paling biasa. Walau bagaimanapun, apabila anda membuat kesilapan dalam memanggil pembina kelas asas, akan ada situasi di mana pembina kelas asas dipanggil dengan tidak betul. Di bawah disenaraikan beberapa situasi biasa di mana panggilan pembina kelas asas tidak betul:

  1. Ketakpadanan jenis parameter bagi pembina kelas asas: Apabila anda memanggil pembina kelas asas, anda mesti memastikan bahawa parameter dalam pembina kelas terbitan Jenis sepadan dengan jenis parameter pembina kelas asas. Jika parameter pembina kelas asas dan kelas terbitan tidak sepadan, ia akan menyebabkan ralat kompilasi. Contohnya:
#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){}
        Base(int a){ cout<<"Base class with value : "<<a<<"
";}
};
 
class Derived: public Base{
    public:
        Derived(){}
        Derived(int a){ cout<<"Derived class with value : "<<a<<"
";}
};
 
int main(){
    Derived d(10); // 编译错误:没有与此调用匹配的函数
    return 0;
}
  1. Pembina kelas asas dipanggil beberapa kali: Apabila anda memanggil pembina kelas asas dalam pembina kelas terbitan, anda mesti pastikan untuk memanggilnya sekali sahaja, jika tidak ahli kelas asas boleh dimulakan beberapa kali , menyebabkan ralat. Contohnya:
#include<iostream>
using namespace std;

class Base{
    public:
        Base(){ cout<<"Base class constructor called
"; }
};

class Derived: public Base{
    public:
        Derived(){ cout<<"Derived class constructor called
"; }
        Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called
"; }
};

int main(){
    Derived d;
    return 0;
}

Hasil keluaran ialah:

Base class constructor called
Derived class constructor called

Dalam kod di atas, pembina kelas Terbitan memanggil pembina kelas Asas, jadi "Pembina kelas asas dipanggil" adalah output, tetapi memandangkan kelas Terbitan mempunyai hanya satu pembina, jadi Pembina tanpa parameter dipanggil secara lalai, jadi "Pembina kelas terbitan dipanggil" juga dikeluarkan. Jika anda memanggil pembina kelas asas dua kali, anda akan mendapat ralat:

#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){ cout<<"Base class constructor called
"; }
};
 
class Derived: public Base{
    public:
        Derived(){ cout<<"Derived class constructor called
"; }
        Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called
"; }
};
 
int main(){
    Derived d(10);
    return 0;
}

Outputnya ialah:

Base class constructor called
Derived class constructor with value : 10 called
Base class constructor called

Oleh kerana pembina kelas Asas dipanggil dua kali dalam pembina kelas Derived, ia adalah output dua kali "Kelas asas pembina dipanggil". Ini kerana dalam C++, proses pembinaan objek kelas terbitan mula-mula memanggil pembina kelas asas dan kemudian memanggil pembina kelas terbitan. Oleh itu, jika anda memanggil pembina kelas asas dua kali dalam pembina kelas terbitan, pembina kelas asas akan dipanggil dua kali, menyebabkan ralat.

  1. Pembina kelas asas tidak dipanggil: Apabila anda memanggil fungsi maya dalam pembina kelas asas, apabila anda memanggil pembina kelas asas dalam pembina kelas terbitan, fungsi maya kelas asas tidak akan dipanggil, jadi Mei menyebabkan ralat program.
#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){ f(); }
        virtual void f(){ cout<<"Base
"; }
};
 
class Derived: public Base{
    public:
        Derived(){ cout<<"Derived
"; }
        void f(){ cout<<"Derived
"; }
};
 
int main(){
    Derived d;
    return 0;
}

Hasil keluarannya ialah:

Derived

Dalam atur cara di atas, fungsi f() dalam pembina kelas asas ialah fungsi maya, dan apabila objek Terbitan dicipta, pembina kelas terbitan terlebih dahulu memanggil pembina daripada kelas asas , jadi fungsi f() kelas Asas dipanggil. Walau bagaimanapun, apabila f() dipanggil dalam pembina kelas asas, pembina objek kelas terbitan belum lagi dilaksanakan, jadi fungsi f() dalam kelas terbitan belum lagi dipanggil, hanya fungsi f() bagi kelas asas telah dipanggil. Oleh itu, output adalah "Asas" dan bukannya "Terbitan".

2. Bagaimana untuk menangani panggilan pembina kelas asas yang salah?

Jika anda menghadapi situasi di mana pembina kelas asas dipanggil dengan salah, bagaimanakah anda harus menanganinya? Di bawah disenaraikan beberapa cara untuk menangani panggilan pembina kelas asas yang salah:

  1. Semak jenis parameter: Jika anda menghadapi ralat ketidakpadanan jenis parameter semasa memanggil pembina kelas asas, anda harus menyemak sama ada jenis data parameter adalah betul. seperti sama ada ia adalah jenis data seperti int, double, char, dll.
  2. Semak panggilan pembina: Jika anda menghadapi situasi di mana pembina kelas asas dipanggil beberapa kali, anda harus menyemak sama ada pembina kelas asas dipanggil dengan betul dalam pembina kelas terbitan, dan pastikan ia dipanggil sekali sahaja.
  3. Elakkan memanggil fungsi maya dalam pembina kelas asas: Jika anda memanggil fungsi maya dalam pembina kelas asas, dan memanggil pembina kelas asas dalam pembina kelas terbitan, anda harus mengelak daripada memanggil fungsi maya dalam fungsi pembina kelas asas. Jika anda mesti memanggil fungsi maya dalam pembina kelas asas, anda harus menggunakan fungsi maya tulen atau kaedah lain untuk mengelakkan ralat.
  4. Elak menggunakan penunjuk pintar dalam pembina: Jika anda menggunakan penunjuk pintar dalam pembina, anda harus mengelak daripada menggunakan penunjuk kepada objek semasa dalam penunjuk pintar. Kerana nilai penunjuk pintar mungkin NULL sebelum objek semasa dimulakan, menyebabkan ralat masa jalan.

Ringkasnya, apabila anda menghadapi panggilan yang salah kepada pembina kelas asas, jangan panik Anda harus menyemak ralat dengan teliti dan mengendalikannya mengikut kaedah pemprosesan di atas. Dengan cara ini, anda boleh mengelakkan ralat menjalankan program dengan berkesan disebabkan oleh panggilan yang salah kepada pembina kelas asas.

Atas ialah kandungan terperinci Ralat sintaks C++: Panggilan pembina kelas asas tidak betul, 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