-6

这段代码有问题,

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

它说 C.getRadius() 不是可修改的左值。有人可以帮忙吗..

4

2 回答 2

5

getRadius()返回对象半径的副本,而不是对其的引用,因此您不能将其用于修改。所以下面的表达式:

C.getRadius()=t;

尝试修改临时副本,这是不允许的。(它不允许的原因是,否则该代码将编译但没有任何用处,给出一个微妙的错误,而不是一个容易识别的编译错误)。

有多种选择:

  • 返回参考,double & getRadius();
  • 添加一个void setRadius(double);函数,并将其用于修改
  • 公开半径;除非有必要强制执行不变量,否则使用访问器没有什么意义。

如果您确实需要访问器函数,则应保留现有的double getRadius(),但声明它const。这将允许您获取但不能修改常量对象的半径。

于 2013-04-16T12:58:17.070 回答
2

这是一个不正确的分配,您正在尝试修改rnotr本身的临时副本:

C.getRadius()=t;

解决此问题的一种方法是将此方法添加到Circle

void setRadius( double t ){ r = t ; }

并调用:

void   Conus::setRadius(double t ) { C.setRadius( t ); }

这是一篇很棒的文章理解 C 和 C++ 中的左值和右值,第一个示例与您刚才面临的问题相似。

于 2013-04-16T12:49:50.187 回答