C++友元类的分文件编写

在学习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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值