2017-04-27 11 views
1
// Example program 
#include <iostream> 
#include <string> 
using namespace std; 

class circle { 

    private: 
    double r; 
    double const pi=3.14; 

    public: 

    circle(double rad){ 

     r=rad; 

     } 

    void periArea(){ 
     double p,s; 

     p=2*pi*r; 
     s=pi*pi*r; 
     cout<<"\nS= "<<s<<endl; 
     cout<<"\nP= "<<p<<endl; 
     } 

     friend void changeRad(circle circle, double newrad); 
    }; 

    void changeRad(circle circle, double newrad){ 

     circle.r=newrad; 

     } 

int main() 
{ 
    double inpr,newr; 
    cout<<"input radius: "; 
    cin>>inpr; 
    circle c1(inpr); 
    c1.periArea(); 
    cout<<"\ninput new radius: "; 
    cin>>newr; 
    changeRad(c1,newr); 
    c1.periArea(); 
} 

私は周辺と面積を計算するクラスサークルを定義する必要があるこのcppコードを取得してから、フレンド関数を使用して半径を変更し、再度面積と周囲を計算します。しかし、変更関数の後でも同じpとsの値が得られます。値は変更されません

+2

すごくいいです。あなたは***に質問しますか? – abelenky

答えて

6

ぞんざいに、あなたは参照による円を渡すためにあなたの関数を変更する必要があります。

void changeRad(circle& circle, double newrad){ 

&の使用に注意してください)。それ以外の場合は、circleインスタンスのコピーが関数に渡され、そのコピーに対する変更は元のものに反映されません。

しかし、物事の通常方法は、あなたが呼び出しサイトで

c1.changeRad(newr); 

を使用するようにコードを配置することです。

また、doubleを使用すると、piをわずか3人の有効数字に保存することはかなりひどいです。私のお気に入りの方法は、(M_PIはPOSIX、ISOでないです!)があなたのためにパイを定義していません C++標準以来

const double PI = std::atan(1.0) * 4; 

を使用することです。

+0

メソッドを呼び出す*通常の方法*は私に少し奇妙に聞こえる。 * OOP方法*です。通常のことは、コンテキスト、セマンティクス、スタイルに大きく依存します。データを含む構造体に作用する自由な関数には何も問題はありません。 – lisyarus

+0

ありがとうございました!出来た。これは学校のためのもので、piをdouble constanantとして宣言し、クラスの外でフレンド関数を使用することが割り当てられています。 – 7h3Ph3n0m

+0

その場合は、デバッガからマイニックの値を取得し、ハードコードしてください。またはインターネット上で見つけてください。しかし、プラットフォーム上の浮動小数点型double型の精度が不十分である可能性があるため、これは最善の方法ではありません。小数点記号の後に余分な数字を捨てなければならないので、余分な精度を供給することは決して問題ではないことに注意してください。 – Bathsheba

1

あなたはその名の型の名前と一致した場合には、パラメータの有効な宣言ですが、それにもかかわらず、これが混乱することができていることを考慮してください参照

friend void changeRad(circle &circle, double newrad); 
          ^^^ 

によってオブジェクトに型サークルを渡す必要がありますパラメータの名前は型の名前を隠します。だから、また、機能クラスの非静的メンバを作成する方がよい例として

friend void changeRad(circle &c, double newrad); 
           ^^ 

のパラメータの名前の名前を変更することをお勧めします。たとえば

void changeRad(double newrad); 
関連する問題