类与友元

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;
}

程序运行结果如下

猜你喜欢

转载自blog.csdn.net/weixin_43871369/article/details/85055199