在学习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; // 超前定义ClassAclass 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.