Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat kompilasi C++: objek bukan const tidak boleh memanggil fungsi ahli const, bagaimana untuk menyelesaikannya?

Ralat kompilasi C++: objek bukan const tidak boleh memanggil fungsi ahli const, bagaimana untuk menyelesaikannya?

PHPz
PHPzasal
2023-08-21 21:33:061140semak imbas

Ralat kompilasi C++: objek bukan const tidak boleh memanggil fungsi ahli const, bagaimana untuk menyelesaikannya?

Dalam C++, fungsi ahli const merujuk kepada menambah kata kunci const selepas pengisytiharan fungsi, yang bermaksud bahawa fungsi itu tidak akan mengubah suai keadaan objek. Apabila objek adalah jenis const, fungsi ahli bukan const biasa tidak boleh dipanggil, tetapi fungsi ahli const boleh dipanggil. Walau bagaimanapun, apabila objek bukan const memanggil fungsi ahli const, ralat berikut akan berlaku semasa penyusunan: Objek bukan const tidak boleh memanggil fungsi ahli const.

Ralat ini biasanya berlaku dalam dua situasi berikut:

  1. Objek bukan const memanggil fungsi ahli const

Contoh:

class Example {
public:
  void doSomething() const {
    // const function
  }
};

int main() {
  Example obj;
  obj.doSomething(); // 编译错误
  return 0;
}

Apabila fungsi ahli const dipanggil pada objek bukan const, pengkompil akan memberikan ralat di atas. Ini kerana keadaan objek boleh diubah oleh fungsi, dan pengkompil tidak mempunyai cara untuk mengetahui sama ada fungsi ahli const benar-benar tidak mengubah suai objek.

Penyelesaian:

Untuk mengelakkan ralat ini, anda perlu menandakan objek panggilan sebagai const. Ini boleh dicapai dengan menambah kata kunci const selepas jenis objek, contohnya:

const Example obj;
obj.doSomething(); // 正确,因为 obj 是 const 类型的
  1. objek const memanggil fungsi bukan ahli const

Contohnya:

class Example {
public:
  void doSomething() {
    // non-const function
  }
};

int main() {
  const Example obj;
  obj.doSomething(); // 编译错误
  return 0;
}

Dalam kes ini, kerana objek adalah jenis const , pengkompil akan menganggap bahawa keadaan objek tidak boleh diubah suai, dan dengan itu menolak untuk memanggil fungsi ahli bukan const.

Penyelesaian:

Jika anda benar-benar perlu mengubah suai keadaan objek, anda boleh menukarnya kepada jenis bukan const. Ini boleh dicapai dengan menggunakan operator penukaran jenis const_cast, contohnya:

const Example obj;
const_cast<Example&>(obj).doSomething(); // 正确,但不建议这样做

Perlu diingat bahawa menggunakan const_cast untuk penukaran jenis boleh membawa kepada tingkah laku yang tidak ditentukan, jadi penggunaannya dalam kod formal harus dielakkan.

Ringkasan

Di atas adalah penyelesaian kepada dua ralat kompilasi C++ biasa: objek bukan const tidak boleh memanggil fungsi ahli const. Semasa menulis kod, anda harus berhati-hati untuk menandakan fungsi ahli const sebagai const dan elakkan memanggil fungsi bukan ahli const pada objek const. Jika anda benar-benar perlu mengubah suai keadaan objek const, anda harus menggunakan const_cast untuk penukaran jenis, tetapi anda harus mengelak daripada menggunakannya dalam kod rasmi.

Atas ialah kandungan terperinci Ralat kompilasi C++: objek bukan const tidak boleh memanggil fungsi ahli const, bagaimana untuk menyelesaikannya?. 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