C++ 从成员函数到友元函数的转换

C++ 从成员函数到友元函数的转换,c++,class,oop,object,uml,C++,Class,Oop,Object,Uml,我的任务是将所有成员函数转换为友元函数,并添加一个副本构造函数。我没有真正理解本周的讲座。请大家在这里转换任意两个函数(一个是访问函数,另一个是来自加法/乘法块)。只有一个函数,其余的我来做。先发制人 #include <iostream> #include <string.h> using namespace std; class fraction { long num; long den; public: fraction(long,long); frac

我的任务是将所有成员函数转换为友元函数,并添加一个副本构造函数。我没有真正理解本周的讲座。请大家在这里转换任意两个函数(一个是访问函数,另一个是来自加法/乘法块)。只有一个函数,其余的我来做。先发制人

#include <iostream>
#include <string.h>

using namespace std;
class fraction
{
 long num;
 long den;

 public: 
fraction(long,long);
fraction();
~fraction();
void  setNum ( long ); 
void  setDen ( long );
long  getNum ( void );
long    getDen ( void );  

void  print  (void);

void add  (fraction, fraction);
void sub  (fraction, fraction);
void mult (fraction, fraction);
void div  (fraction, fraction);
void inc  (fraction);

}  ;   // end of class fraction

long gcd (long x, long y); 

fraction::fraction(long l_num, long l_den)
{

    num = l_num;
    den = l_den;
}
fraction::fraction()
{

}
fraction::~fraction()
{


}

void fraction::setNum (long  l_num )
 {
  num = l_num ;
 }


void fraction::setDen (long l_den )
 {
  den = l_den ;
 }

long fraction::getDen ( )
 {
  return den ;
 }

long fraction::getNum ( )
 {
  return num ;
 }          

void fraction:: print (void)
{
   cout<<num/gcd(num,den)<<"/"<<den/gcd(num,den) <<endl;
} 

void fraction::add (fraction f1, fraction f2)
{ 
  num = (f1.getNum ( ) * f2.getDen ( )) + ( f1.getDen ( ) * f2.getNum ( ) );
  den = (f1.getDen ( ) * f2.getDen ( ));
}  

void fraction::sub (fraction f1, fraction f2)
{ 
  num = (f1.getNum ( ) * f2.getDen ( )) - ( f1.getDen ( ) * f2.getNum ( ) );
  den = (f1.getDen ( ) * f2.getDen ( ));
}  

 void fraction::mult (fraction f1, fraction f2)
{ 
  num = (f1.getNum ( ) * f2.getNum ( )); 
  den = (f1.getDen ( ) * f2.getDen ( ));

}  

void fraction::div(fraction f1, fraction f2)
{ 

 num = (f1.getNum ( ) * f2.getDen ( )); 
 den = (f1.getDen ( ) * f2.getNum ( ));
 }

void fraction::inc (fraction f1)
{ 
  num = (f1.getNum ( )) + ( f1.getDen ( ) );
 den = (f1.getDen ( ) );

 }  


long gcd (long x, long y)
{
 return (x == 0) ? y :  gcd (y%x, x); 
} 

int main ( )
{
 //  define seven instances of the class fraction
 fraction f1(1L,2L),f2(3L,4L),f3, f4,f5,f6, f7;

 //set values for the numerator and denominator to f1 and print them
 //f1.setDen( 2L);
 //f1.setNum( 0L);
 f1.print();

 //set values for the numerator and denominator to f2 and print them
 //f2.setDen( 4L);
 //f2.setNum( 3L); 
 f2.print();

 f3.add( f1, f2);
 f3.print();

 f4.sub( f1, f2);
 f4.print();

 f5.mult( f1, f2);
 f5.print();

 f6.div( f1, f2);
 f6.print();

 f7.inc(f1);
 f7.print();

 return 0;

 }
#包括
#包括
使用名称空间std;
类分数
{
长数;
龙穴;
公众:
分数(长,长);
分数();
~fraction();
void setNum(长);
无效设置(长);
长getNum(void);
朗格登(无效);
作废打印(作废);
空隙添加(分数,分数);
空隙子(分数,分数);
空隙倍数(分数,分数);
空隙率(分数,分数);
void公司(分数);
}  ;   // 期末分数
长gcd(长x,长y);
分数:分数(长l_数,长l_数)
{
num=l_num;
den=l_den;
}
分数::分数()
{
}
分数::~分数()
{
}
空隙率::setNum(长l_num)
{
num=l_num;
}
空隙率::塞顿(长l_den)
{
den=l_den;
}
长分数::getDen()
{
返回巢穴;
}
长分数::getNum()
{
返回num;
}          
空隙率::打印(空隙)
{

cout复制构造函数可以如下所示

fraction( const fraction & );
并被定义为

fraction::fraction( const fraction &rhs ) : num( rhs.num ), den( rhs.den )
{
}
我会将算术函数声明为返回一个分数类型的对象

比如说

friend const fraction add( const fraction &, const fraction & );
并将其定义为

const fraction add( const fraction &lhs, const fraction &rhs )
{
    return fraction( lhs,getNum() * rhs.getDen() + rhs.getNum() * lhs.getDen(), 
                     lhs.getDen() * rhs.getDen() );
}
考虑到函数getNum和getDen必须声明为

long  getNum() const;
long  getDen() const;  
函数inc可以声明为

friend const fraction inc( fraction & ); 
或作为


取决于它是模拟增量后操作还是增量前操作。

如何编写getNum()函数?@user2951660 long fraction::getNum()const{return num;}Blagodarya..Thanx vladbut getName和setName不能转换为友元函数,不是吗?@YourFavoriteNoob如果你愿意,你可以将它们转换为友元函数。但我看不出这有什么意义。通常Getter和Setter都是成员函数。
friend fraction & inc( fraction & );