C++11 C++;使用[]重载读取和写入信息

C++11 C++;使用[]重载读取和写入信息,c++11,C++11,我有以下课程: class MyPoint { public: // Constructor MyPoint(double, double, double); // Destructor virtual ~MyPoint(){}; protected: private: double x; double y; double z; }; 我想重

我有以下课程:

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

        // Destructor
        virtual ~MyPoint(){};

    protected:

    private:
        double x;
        double y;
        double z;

};
我想重载运算符[]以读取和写入数据

比如:

myPoint[0] will return x
myPoint[1] will return y
myPoint[2] will return z
如果我这样做了:

myPoint[0]=2 will set x = 2
myPoint[1]=3 will set y = 3
myPoint[z]=4 will set z = 4
关于第一部分,我有:

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

第二个我不知道。

当前,您的
操作符[]
按值返回x、y或z的当前值。因此,如果你写

myPoint[0]=2;
这将尝试复制
myPoint.x
的值,然后在
myPoint
中的原始值不变的情况下尝试修改它。这在概念层面上不起作用,也不会编译,因为赋值没有任何意义,正如编写
4=2
没有任何意义一样。无法更改
=
运算符的左侧

您要做的是让您的
操作符[]
通过引用返回。您可以通过将返回类型从
double
更改为
double&
来实现这一点,并给出签名:

double&运算符[](int输入);
这样,您将更改双重引用的值,即对象中的双重引用

您可以在internet上找到更多教程,例如


clcto指出的要点很重要,您应该记住:如果将
运算符[]
与0、1或2以外的任何其他索引一起使用,则控制流不会以返回语句结束,这是一种未定义的行为。您可能希望在运行时对此进行检查,并在发生这种情况时引发异常。

您需要通过引用而不是通过值返回成员变量,这样您就有了一个
左值,可以分配给:

double& operator[](int entry)
//    ^
//    |
{
    if (entry==0)
        return x;
    else if(entry==1)
        return y;
    else if(entry==2)
        return z;
}
请注意,当传递0、1或2以外的任何内容时,当前不会返回任何内容,因此会显示未定义的行为。如果其他任何内容被视为无效,您可能应该引发异常:

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));
}