cara membuat beberapa operator kelebihan beban dalam pemrograman berorientasi objek c++ seperti obj[10]=3 dengan operator [] dan operator =

saya memiliki kelas tertentu dan saya ingin membuat 2 operator yang akan bekerja sama

menyukai kelas dengan array dan saya ingin mengubah indeks tertentu dalam array

seperti ini objek[3]=5

apakah ini mungkin? jika ya, bagaimana caranya?

ini adalah kode yang saya buat untuk operator [].


double Polynomial::operator[](int index) const {
    int maxT = this->currentMax;
    if (index > 0 && index < this->getDegree(false))
        return this->coefficients[index];
    cout << "overflow in index";
    system("pause");
}


person Tal K    schedule 22.04.2020    source sumber
comment
Apakah ini menjawab pertanyaan Anda? operator penugasan kelebihan beban Dengan operator subskrip   -  person scohe001    schedule 22.04.2020
comment
Meskipun tidak salah melakukan pemeriksaan batas di operator[], hal ini tidak lazim. Kebanyakan container melewati pemeriksaan batas di operator[] (agar secepat mungkin) dan menyediakan fungsi anggota yang disebut at() yang melakukan pemeriksaan batas dan memberikan pengecualian jika index di luar batas. Ngomong-ngomong, index biasanya bertipe unsigned, seperti size_t. Berikut ini contoh sederhana untuk dimainkan: godbolt.org/z/qr26cd   -  person Ted Lyngmo    schedule 22.04.2020
comment
Tidak ada satu operator []=, jadi Anda tidak dapat membebaninya secara berlebihan. Anda dapat membebani operator [] dan operator = secara berlebihan.   -  person Thomas Matthews    schedule 22.04.2020
comment
@ThomasMatthews Saya tidak melihat operator []= disebutkan atau tersirat. Judul menyebutkan [] dan = secara terpisah.   -  person Ted Lyngmo    schedule 22.04.2020
comment
@TedLyngmo Saat saya membaca judulnya, tidak disebutkan penggunaan [] dan = secara terpisah.   -  person Thomas Matthews    schedule 22.04.2020
comment
@ThomasMatthews Mungkin saya memakai kacamata pemaaf :-) operator [] dan = operator terdengar seperti operator[] dan operator= bagi saya dan implementasi operator[] (bukan operator[]=) juga membuat saya pikir OP tahu bahwa mereka adalah operator yang terpisah.   -  person Ted Lyngmo    schedule 22.04.2020


Jawaban (1)


operator[] Anda adalah metode const, sehingga tidak dapat digunakan untuk mengubah anggota. Kecuali Anda ingin melakukan sesuatu yang mewah dalam menugaskan suatu elemen, Anda tidak benar-benar memerlukan operator= ketika operator[] Anda mengembalikan referensi ke elemen tersebut.

Seperti disebutkan dalam komentar, melakukan pemeriksaan batas di operator[] bukanlah hal yang biasa. Pertimbangkan bahwa dalam satu lingkaran, setiap panggilan ke operator[] akan melakukan pemeriksaan batas meskipun pengguna memastikan bahwa hanya indeks valid yang digunakan. Itu tidak cukup efisien. Jadi selain operator const Anda, Anda dapat menyediakan yang ini

double& Polynomial::operator[](size_t index)  {  // <-- no const
    return coefficients[index];
}

Dengan asumsi Anda juga memiliki metode size, Anda kemudian dapat menulis satu lingkaran:

for (size_t i=0; i< poly.size(); ++i) {
    poly[i] = i;
}

PS: system("pause") tidak boleh dilakukan, lihat system(pause); - Kenapa salah?

person 463035818_is_not_a_number    schedule 22.04.2020