2013-04-16 45 views
-6

有問題,此代碼幫助,請在此C++代碼(修改的左值)

#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()是不可修改的左值。是否有人可以幫助..

+0

查看FAQ http://stackoverflow.com/faq。它可以幫助你發佈更多可以幫助你的人獲得關注的問題。 –

+0

我想回答「你正試圖給一個函數賦值」,但後來我意識到你可以用C++來做到這一點。 – Detheroc

回答

5

getRadius()返回對象半徑的副本,而不是對它的引用,所以不能用它來修改。所以下面的表達式:

C.getRadius()=t; 

試圖修改臨時副本,這是不允許的。 (不允許的原因是否則該代碼會編譯,但沒有任何用處,給出一個微妙的錯誤,而不是一個容易識別的編譯錯誤)。

有多種選擇:

  • 回報參考,double & getRadius();
  • 添加void setRadius(double);功能,並使用了修改
  • 使半徑公衆;使用訪問器幾乎沒有意義,除非它們需要執行不變量。

如果您確實需要訪問器功能,您應該保留現有的double getRadius(),但聲明它const。這將允許您獲取但不修改常量對象的半徑。

2

這是一個不正確的分配,你正試圖修改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 and C++,第一個例子與您剛纔所面臨的問題類似。

+0

是的,但是r是私有的.. –

+0

它實際上是'Cr' – Detheroc

+0

無法訪問圓弧從圓錐類功能 –