1.B中成员函数是A的一个友元函数,主要就是函数定义和类声明的顺序问题
//TVFM.h
#ifndef _TVFM_H_
#define _TVFM_H_
#include<iostream>
/*B中成员函数是A的一个友元函数,主要就是函数定义和类声明的顺序问题*/
using namespace std;
class A;//1.首先前向声明
class B
{
private:
double b;
public:
B(double n = 0) :b(n){}
~B(){}
void setA(A &obj);//2.如果要利用类A的引用形参,必须加前向声明
};
class A
{
private:
int a;
public:
A(int n = 0) :a(n){}
~A(){}
void show()const{ cout << "a=" << a << endl; }
friend void B::setA(A &obj);//3.声明为友元
};
inline void B::setA(A &obj)//4.同一个文件中可以定义为内联函数
{
obj.a = (int)b;
}
#endif //_TVFM_H_
//main.cpp
//#include<iostream>
//#include<cstdlib>
#include"TVFM.h"
using namespace std;
int main()
{
A *obja = new A(4);
B objb = B(9.5);
cout << "The orignal obja:\n";
obja->show();
cout << "After objb.setA(*obja), the obja:\n";
objb.setA(*obja);
obja->show();
delete obja;
system("pause");
return 0;
}
运行结果如下
2./*A和B互为友元函数*/
//TVFM.h
#ifndef _TVFM_H_
#define _TVFM_H_
#include<iostream>
/*互为友元函数*/
using namespace std;
class B
{
friend class A;
private:
double b;
public:
B(double n = 0) :b(n){}
~B(){}
void show(){ cout << "b=" << b << endl; }
void setA(A &obj);
};
class A
{
friend class B;
private:
int a;
public:
A(int n = 0) :a(n){}
~A(){}
void show()const{ cout << "a=" << a << endl; }
void setB(B &obj);
};
inline void A::setB(B &obj)
{
obj.b = (double)a;
}
inline void B::setA(A &obj)
{
obj.a = (int)b;
}
#endif //_TVFM_H_
//main.cpp
//#include<iostream>
//#include<cstdlib>
#include"TVFM.h"
using namespace std;
int main()
{
A *obja = new A(4);
B objb = B(9.5);
cout << "The orignal obja:\n";
obja->show();
cout << "After objb.setA(*obja), the obja:\n";
objb.setA(*obja);
obja->show();
obja->setB(objb);
cout << "obja->setB(objb), the objb:\n";
objb.show();
delete obja;
system("pause");
return 0;
}
程序运行结果如下