2017-04-27 27 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位有效数字非常可怕。我最喜欢的方式是使用

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

,因为C++标准并没有定义PI(M_PI是POSIX,而不是ISO!)。

+0

调用方法*正常方式*对我来说听起来有点奇怪。它是* OOP方式*。什么是正常的高度依赖于语境,语义和风格。自由函数作用于包含数据的结构没有任何问题。 – lisyarus

+0

谢谢!有效。这对于学校来说是派遣人员将pi声明为double constanant并在班级之外使用friend功能的。 – 7h3Ph3n0m

+0

在这种情况下,请从调试器中剔除我的值,并对其进行硬编码,或在互联网上找到一个。但这不是最好的选择,因为您的平台上的浮点双精度型可能不够精确。请注意,提供超额精度从来就不是问题,因为编译器需要在小数点分隔符后丢弃多余的数字。 – Bathsheba

1

你必须参考

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

传递对象类型圈要考虑到的是,虽然它是一个参数的有效申报时,其名称与类型的名称一致不过这可以混淆阅读器和参数的名称隐藏类型的名称。所以,最好是参数的名称重命名,例如

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

而且它是更好地使该函数的类的非静态成员。例如

void changeRad(double newrad);