簡體   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