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