在学习C++的关于友元类的知识时,网课例程中是在main函数文件中编写实现,但是我们知道,一般情况下,类以及类的成员函数实现都是在不同文件中实现的,因此,我们会自然的想到友元类是如何在不同文件下编写实现的,以下是我的一些想法。
我一共定义了两个类,分别是ClassA以及ClassB(以下简称为A、B),B类是A的友元类。份文件实现主要有三点需要注意:
1、A类和B类的头文件要相互包含
2、在定义B类之前,需要超前定义A类。即在ClassB.h中,在写class ClassB{ };之前,应当先写 class ClassA,目的是让系统知道A类的存在。
3、既然B是A的友元类,那么应当在A类的实现中写friend class ClassB; 不要写反了。
以下是程序的具体实现。(请大家注意阅读我的注释,上述的注意点都在注释中体现出来)
首先是ClassA.h
#ifndef __CLASSA_H__
#define __CLASSA_H__
#include <iostream>
#include "ClassB.h" // 头文件的相互包含
using namespace std;
class ClassA
{
friend class ClassB; // ClassB是ClassA的友元
private:
int m_A_private_data;
public:
ClassA();
~ClassA();
int m_A_public_data;
};
#endif
接下来是ClassA.cpp,这里主要是初始化public和private的数据,便于后面验证
#include "ClassA.h"
ClassA::ClassA()
{
this->m_A_private_data = 10;
this->m_A_public_data = 20;
}
ClassA::~ClassA()
{
}
这样,我们就完成了关于A类的实现。现在,我们实现B类,首先是ClassB.h
#ifndef __CLASSB_H__
#define __CLASSB_H__
#include <iostream>
#include "ClassA.h" // // 头文件的相互包含
using namespace std;
class ClassA; // 超前定义ClassA
class ClassB
{
private:
public:
ClassB();
~ClassB();
void visit_classA();
ClassA *class_a;
};
#endif
之后是ClassB.cpp的实现
#include "ClassB.h"
ClassB::ClassB()
{
class_a = new ClassA;
}
void ClassB::visit_classA()
{
cout << "visit public: " << class_a->m_A_public_data << endl;
cout << "visit private:" << class_a->m_A_private_data << endl;
}
ClassB::~ClassB()
{
delete class_a;
cout << "ClassB的析构函数" << endl;
}
实现了A类和B类,就可以在main函数中进行测试了
#include <iostream>
#include "ClassA.h"
#include "ClassB.h"
using namespace std;
// 通过类B来访问类A,即B是A的友元
int main(int argc, char **argv)
{
ClassB b;
b.visit_classA();
return 0;
}
以下是实验结果
可以看到,我们通过B类访问到了A类的成员成员属性 m_A_private_data = 10.