Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: pemusnah maya mesti ditakrifkan, bagaimana untuk menanganinya?

Ralat sintaks C++: pemusnah maya mesti ditakrifkan, bagaimana untuk menanganinya?

WBOY
WBOYasal
2023-08-22 17:13:461355semak imbas

Ralat sintaks C++: pemusnah maya mesti ditakrifkan, bagaimana untuk menanganinya?

C++ ialah bahasa pengaturcaraan taip kuat yang digunakan secara meluas dalam pembangunan pelbagai aplikasi komputer. Tidak seperti kebanyakan bahasa pengaturcaraan lain, C++ membenarkan penggunaan fungsi maya dan pemusnah maya untuk mencipta polimorfisme, ciri yang memainkan peranan penting dalam pengaturcaraan berorientasikan objek.

Walau bagaimanapun, apabila anda menulis program C++, anda mungkin menghadapi pelbagai ralat sintaks. Satu kesilapan biasa ialah pemusnah maya mesti ditakrifkan. Pemusnah maya ialah fungsi maya yang diisytiharkan dalam kelas asas yang tujuannya adalah untuk memastikan ingatan dikeluarkan dengan betul semasa pemusnahan objek kelas terbitan. Jika pemusnah maya tidak ditakrifkan atau ditakrifkan secara salah, ralat akan berlaku.

Jadi, bagaimana kita harus menangani kesilapan ini? Berikut ialah beberapa penyelesaian yang mungkin:

1. Tambahkan definisi untuk pemusnah maya

Jika anda mendapat mesej ralat bahawa pemusnah maya mesti ditakrifkan, penyelesaian paling mudah ialah menambah definisi untuk pemusnah maya. Ini boleh dicapai dengan menambah definisi fungsi dalam fail pengisytiharan kelas asas.

Sebagai contoh, pertimbangkan kod berikut:

class Base {
public:
  virtual ~Base() = 0;
};

class Derived : public Base {
public:
  ~Derived() { std::cout << "Derived destructor
"; }
};

int main() {
  Base* b = new Derived();
  delete b;
}

Dalam contoh ini, kelas asas Base mengisytiharkan pemusnah maya, tetapi tidak menyediakan pelaksanaan konkrit. Dalam kelas Derived, kami menyediakan pemusnah, tetapi fungsi ini bukan maya. Apabila kita mencipta objek Terbitan dalam atur cara dan memadamnya menggunakan operator padam, pengkompil akan menghasilkan mesej ralat "rujukan tidak ditentukan kepada `vtable for Base'". Ini kerana kami tidak memberikan definisi yang betul untuk fungsi maya kelas asas.

Untuk menyelesaikan masalah ini, kami boleh memberikan definisi untuk pemusnah maya dalam fail pengisytiharan kelas asas, contohnya:

class Base {
public:
  virtual ~Base() = 0;
};

Base::~Base() {}

Ini akan menyediakan pelaksanaan asas dan memastikan pengkompil boleh memautkan atur cara dengan betul.

2. Istiharkan pemusnah maya sebagai fungsi maya tulen

Penyelesaian lain ialah mengisytiharkan pemusnah maya sebagai fungsi maya tulen. Ini boleh dicapai dengan menggunakan "=0" dalam kelas asas. Mengisytiharkan fungsi maya tulen bermakna fungsi itu mesti ditakrifkan dalam kelas terbitan.

Sebagai contoh, kita boleh mengisytiharkan pemusnah maya dalam kelas asas seperti berikut:

class Base {
public:
  virtual ~Base() = 0;
};

Base::~Base() {}

class Derived : public Base {
public:
  ~Derived() { std::cout << "Derived destructor
"; }
};

int main() {
  Base* b = new Derived();
  delete b;
}

Di sini, pemusnah maya diisytiharkan sebagai fungsi maya tulen, dan hanya definisi asas disediakan dalam kelas asas. Kelas Derived tidak perlu menyediakan pemusnahnya sendiri kerana pemusnah maya yang diwarisi daripada kelas asas akan dipanggil.

3 Periksa sama ada pemusnah kelas terbitan dengan betul memanggil pemusnah kelas asas

Jika takrif pemusnah maya adalah betul, tetapi masih terdapat ralat "rujukan tidak ditentukan kepada `vtable for Base'", ia mungkin kerana The pemusnah kelas terbitan tidak memanggil pemusnah kelas asas dengan betul.

Sebagai contoh, katakan kita menukar pemusnah kelas terbitan kepada kod berikut:

class Derived : public Base {
public:
  ~Derived() { std::cout << "Derived destructor
"; }
};

Ini akan menyebabkan pengkompil menghasilkan mesej ralat yang sama seperti sebelumnya. Untuk menyelesaikan masalah ini, kita perlu mengubah suai pemusnah kelas Terbitan kepada kod berikut:

class Derived : public Base {
public:
  ~Derived() { std::cout << "Derived destructor
"; }
};

Ini akan memastikan bahawa pemusnah kelas asas dipanggil dengan betul, sekali gus membebaskan memori.

Ringkasnya, ia adalah ralat sintaks C++ biasa yang pemusnah maya mesti ditakrifkan. Jika anda menghadapi ralat ini, anda boleh menyelesaikan masalah dengan menambahkan definisi untuk pemusnah maya, mengisytiharkannya sebagai fungsi maya tulen, atau menyemak sama ada pemusnah kelas terbitan memanggil pemusnah kelas asas dengan betul. Tidak kira kaedah yang digunakan, anda harus memastikan program mengeluarkan memori dengan betul, yang memainkan peranan penting dalam reka bentuk program.

Atas ialah kandungan terperinci Ralat sintaks C++: pemusnah maya mesti ditakrifkan, 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