繁体   English   中英

C++ 不可修改的左值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM