[英]C++ not modifiable lvalue
当我运行这段代码时,我收到一条错误消息,指出C.getRadius()
不是可修改的左值:
#include <iostream>
#include <conio.h>
using namespace std;
class Circle {
double x, y, r;
public:
Circle (double a=1.0, double b=1.0, double c=1.0) { x=a; y=b; r=c; }
~Circle() {}
double Area();
double getRadius();
};
class Conus {
double height;
Circle C;
public:
Conus (double , double , double , double );
~Conus() {};
double Volume();
void setRadius(double );
};
Conus::Conus(double h, double a, double b, double c)
: C (a, b, c)
{
height=h;
}
double Circle::Area() { return r*r*3.14; }
double Conus::Volume() { return C.Area()*height; }
double Circle::getRadius() { return r; }
void Conus::setRadius(double t ) { C.getRadius()=t; }
int main() {
double a=2.4, b=3.5, r=5.4, h=5.9;
Circle Wre (a, b, r) ;
Conus Konusi (h, a, b, r) ;
cout << "Wris centris koordinatebia: " << a << " da " << b << ", radiusi: " << r
<< ". Wris fartobia :" << Wre.Area() << endl;
cout << "Konusis fudzis centris koordinatebia: " << a << " da " << b << ", radiusi: " << r
<<endl<< "konusis moculobaa: " << Konusi.Volume() << endl;
Konusi.setRadius(r+3);
cout << Konusi.Volume() << endl;
_getch();
return 0;
}
getRadius()
返回对象半径的副本,而不是对它的引用,因此不能使用它进行修改。 所以下面的表达式:
C.getRadius()=t;
试图修改临时副本,这是不允许的。 (它不允许的原因是否则代码会编译但没有做任何有用的事情,给出一个微妙的错误而不是一个容易识别的编译错误)。
有多种选择:
double & getRadius();
void setRadius(double);
function,并使用它进行修改 如果您确实需要访问器函数,则应保留现有的double getRadius()
,但将其声明为const
。 这将允许您获取但不能修改常量 object 的半径。
这是一个不正确的分配,您正在尝试修改r
的临时副本而不是r
本身:
C.getRadius()=t;
解决此问题的一种方法是将此方法添加到Circle
:
void setRadius( double t ){ r = t ; }
并像这样打电话:
void Conus::setRadius(double t ) { C.setRadius( t ); }
这是一篇很棒的文章Understanding lvalues and rvalues in C 和 C++ ,第一个示例与您刚才遇到的问题类似。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.