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