-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

これは正しくない割り当てです。not 自体の一時コピーを変更しようとしてrrます:

C.getRadius()=t;

これを修正する 1 つの方法は、このメソッドを に追加することCircleです。

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

そして次のように呼び出します:

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

これは素晴らしい記事です C および C++の左辺値と右辺値を理解する.最初の例は、あなたが今直面していた問題に似ています.

于 2013-04-16T12:49:50.187 に答える