Rumah >pembangunan bahagian belakang >C++ >Ralat sintaks C++: fungsi ahli bukan const tidak boleh dipanggil dengan objek const, apakah yang perlu saya lakukan?

Ralat sintaks C++: fungsi ahli bukan const tidak boleh dipanggil dengan objek const, apakah yang perlu saya lakukan?

PHPz
PHPzasal
2023-08-22 13:57:051449semak imbas

Ralat sintaks C++: fungsi ahli bukan const tidak boleh dipanggil dengan objek const, apakah yang perlu saya lakukan?

C++ ialah bahasa pengaturcaraan yang sangat berkuasa, tetapi apabila belajar dan menggunakan C++, kita pasti akan menghadapi beberapa masalah. Salah satu masalah yang sering menyusahkan pemula ialah mesej ralat "Fungsi ahli bukan const tidak boleh dipanggil dengan objek const." Dalam artikel ini, kami akan meneroka cara menangani ralat ini.

Pertama sekali, untuk memahami mesej ralat ini, kita perlu mengetahui beberapa pengetahuan asas. Terdapat kata kunci const dalam C++, yang boleh digunakan untuk mengubah suai pembolehubah, penunjuk dan parameter fungsi, menunjukkan bahawa objek ini tidak boleh diubah suai. Dalam C++, jika objek diisytiharkan const, maka fungsi ahlinya juga harus diisytiharkan const.

Apabila kita memanggil fungsi ahli bukan const dengan objek const, pengkompil akan menggesa ralat "Fungsi ahli bukan const tidak boleh dipanggil dengan objek const." Ini kerana dalam C++, objek const adalah baca sahaja dan tidak boleh diubah suai. Fungsi ahli bukan const boleh mengubah suai keadaan objek, jadi ia tidak boleh dipanggil dengan objek const.

Jadi, bagaimana kita harus menangani kesilapan ini? Pertama, kita perlu menentukan sama ada fungsi ahli ini perlu mengubah suai keadaan objek. Jika tidak ada keperluan untuk mengubah suai keadaan objek, maka kita harus mengisytiharkan fungsi ahli ini sebagai const. Dengan cara ini, walaupun kita memanggil fungsi ahli ini menggunakan objek const, tiada ralat akan berlaku.

Sebagai contoh, katakan kita mempunyai kelas:

class Person {
public:
    //getter函数,在不修改对象的情况下获取成员变量的值
    std::string getName() const;
    
    // setter函数,修改对象的成员变量值
    void setName(std::string name);
private:
    std::string m_name;
};

Dalam kelas ini, fungsi getName hanya mendapat nilai m_name dan tidak mengubah suai keadaan objek. Oleh itu, kita harus mengisytiharkannya sebagai const:

std::string getName() const;

Selain itu, apabila mentakrifkan fungsi ini, kita juga mesti menambah kata kunci const selepas nama fungsi:

std::string Person::getName() const {
    return m_name;
}

Dengan cara ini, walaupun kita menggunakan objek const untuk memanggil getName fungsi, ia tidak akan Ralat akan berlaku.

Jika fungsi ahli perlu mengubah suai keadaan objek, maka kami tidak boleh mengisytiharkannya sebagai const. Tetapi jika kita ingin memanggil fungsi ini menggunakan objek const, kita boleh menukar objek ini kepada objek bukan const. Kita boleh menggunakan penukaran jenis untuk mencapai tujuan ini. Sebagai contoh, katakan kita mempunyai objek const Person p, dan kita perlu menggunakan fungsi setName untuk mengubah suai nilai pembolehubah ahli m_name p. Kita boleh melakukan ini:

const Person p;
Person& pRef = const_cast<Person&>(p); // 将const对象转化为非const对象
pRef.setName("New Name"); // 调用setName函数修改成员变量的值

Perlu diingat bahawa pendekatan ini tidak disyorkan. Jika fungsi ahli perlu mengubah suai keadaan objek, maka kita harus mengelak daripada menggunakan objek const untuk memanggil fungsi ini.

Ringkasnya, dalam C++, kita perlu memberi perhatian kepada penggunaan kata kunci const. Jika objek diisytiharkan const, maka fungsi ahlinya juga harus diisytiharkan const. Apabila kita menghadapi ralat "fungsi ahli bukan const tidak boleh dipanggil dengan objek const", kita perlu menyemak dengan teliti sama ada fungsi ahli perlu mengubah suai keadaan objek Jika kita tidak perlu mengubah suai keadaan objek, kita harus mengisytiharkan fungsi ahli sebagai const . Jika fungsi ahli perlu mengubah suai keadaan objek, kita harus mengelak daripada menggunakan objek const untuk memanggil fungsi ini.

Atas ialah kandungan terperinci Ralat sintaks C++: fungsi ahli bukan const tidak boleh dipanggil dengan objek const, apakah yang perlu saya lakukan?. 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