// 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值。
答案 0 :(得分: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!)。
答案 1 :(得分:1)
您必须传递一个对象类型Circle by reference
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
考虑到虽然当名称与类型名称一致时它是参数的有效声明,但这可能会使读者感到困惑,参数名称会隐藏类型的名称。因此,最好重命名参数的名称,例如
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
最好使该函数成为该类的非静态成员。例如
friend void changeRad( circle &circle, double newrad);
^^^