C++友元声明与定义依赖关系

时间:2021-05-31 20:03:12
#ifndef A_H
#define A_H
#include <iostream>
using std::cout;
using std::endl;
class B;//前向声明
class A
{
public:
void dis(const B &b);//只是一个成员函数声明,故B无需现在创建,可以用前向声明 class B;
};
#endif

#ifndef B_H
#define B_H
//class A;//因先 #include "A.h" ,再包含 #include "B.h" ,故可以省略前向声明(A已先定义)
class B
{
private:
int i;
public:
B(int v):i(v){}
B():i(0){}


//友元声明
friend void A::dis(const B &a);//其它类的成员函数作为友元函数
friend void test(const B& b);//普通的非成员函数作为友元函数
};
#endif
#ifndef C_H
#define C_H
class C
{
private:
int c;
public:
C(int v):c(v){}
friend class D;//友元类,只是一个声明,不作为成员一部分,故无需先创建D的定义
};
#endif
#ifndef D_H
#define D_H
#include <iostream>
using std::cout;
using std::endl;
//class C;//因先 #include "C.h" ,再包含 #include "D.h" ,故此语句可以省略
class D
{
public:
void dis(const C& c)//dis成员函数定义,这里要用到形参C,故C必须先定义完整,所以先#include "C.h"
{
cout<<c.c<<endl;
}
};
#endif
#include <iostream>
#include "A.h"
#include "B.h"
#include "C.h"
#include "D.h"
using namespace std;


void A::dis(const B &b)//必须最后定义,因需要两个类完整定义后,才能定义该成员函数
{
cout<<b.i<<endl;
}


void test(const B &b)//普通的非成员函数作为友元函数
{
cout<<b.i<<endl;
}


int main()
{
//其他类的成员函数作为友元函数
A a;
B b(9);
a.dis(b);




//普通的非成员函数作为友元函数
test(b);




//友元类举例
C c(10);
D d;
d.dis(c);




system("pause");
return 0;
}
说明:友元的引入,为了正确地构造类,需要注意友元声明与定义之间的相互依赖。否则会导致编译出错。以上为实例代码,可以借鉴。