Saya memiliki kelas berikut:

class MyPoint
{
    public:
    
        // Constructor
        MyPoint(double, double, double);

        // Destructor
        virtual ~MyPoint(){};

    protected:

    private:
        double x;
        double y;
        double z;

};

Saya ingin membebani operator [] untuk membaca dan menulis data.

Sesuatu seperti:

myPoint[0] will return x
myPoint[1] will return y
myPoint[2] will return z

Dan jika saya melakukannya:

myPoint[0]=2 will set x = 2
myPoint[1]=3 will set y = 3
myPoint[z]=4 will set z = 4

Untuk bagian pertama saya punya:

double operator[](int entry)
{
    if (entry==0)
        return x;
    else if(entry==1)
        return y;
    else if(entry==2)
        return z;
}

Untuk yang kedua saya tidak tahu.

1
Manuel Oliveira 28 Mei 2021, 00:03

2 jawaban

Jawaban Terbaik

Anda perlu mengembalikan variabel anggota berdasarkan referensi alih-alih berdasarkan nilai sehingga Anda memiliki lvalue yang dapat Anda tetapkan ke:

double& operator[](int entry)
//    ^
//    |
{
    if (entry==0)
        return x;
    else if(entry==1)
        return y;
    else if(entry==2)
        return z;
}

Perhatikan bahwa saat ini Anda tidak mengembalikan apa pun ketika melewati apa pun selain 0, 1, atau 2 dan dengan demikian menunjukkan perilaku yang tidak ditentukan. Anda mungkin harus mengajukan pengecualian jika ada hal lain yang dianggap tidak valid:

double& operator[](int entry)
{
    if (entry==0)
        return x;
    else if(entry==1)
        return y;
    else if(entry==2)
        return z;

    throw std::out_of_range("unsupported entry value: " + std::to_string(entry));
}
2
clcto 27 Mei 2021, 21:20

Saat ini, operator[] Anda mengembalikan nilai x, y, atau z berdasarkan nilai saat ini. Jadi, jika Anda menulis

myPoint[0] = 2;

Ini akan mencoba untuk membuat salinan dari nilai myPoint.x dan kemudian mencoba untuk mengubah sementara nilai asli dalam myPoint tidak diubah. Ini tidak bekerja pada tingkat konseptual, dan juga tidak dikompilasi, karena tugas tidak masuk akal, seperti menulis 4 = 2 tidak masuk akal. Sisi kiri operator = tidak dapat diubah.

Yang ingin Anda lakukan adalah membuat operator[] Anda kembali dengan referensi. Anda dapat mencapai ini dengan mengubah tipe pengembalian dari double menjadi double&, dengan memberikan tanda tangan:

double& operator[](int entry);

Dengan cara ini, Anda akan mengubah nilai referensi ganda, yang merupakan nilai ganda di objek Anda.

Anda dapat menemukan tutorial lebih lanjut di internet, mis. di sini

Poin yang clcto tunjukkan adalah penting, Anda harus mengingatnya: Jika Anda menggunakan operator[] Anda dengan indeks selain 0, 1 atau 3, aliran kontrol tidak akan berakhir dengan pernyataan pengembalian, yang merupakan perilaku tidak terdefinisi . Anda mungkin ingin memeriksa ini saat runtime dan memberikan pengecualian jika ini terjadi.

0
He3lixxx 27 Mei 2021, 21:42