记录多文件下友元函数使用过程的问题

最近使用友元函数时出现“私有成员无法访问”和“使用未声明类”等问题,解决后特此记录下友元函数使用过程的坑。
正确代码如下:

//B.h
#pragma once 
class A;  //这里注意要前向声明class A
class B  
{  
public:  
	B(void) {};
	~B(void) {};
    int func(A xx);  
};

//A.h
#pragma once  
#include "B.h"  //这里注意要包括B的头文件
class A
{
	friend int B::func(A xx); 	//并且在声明友元函数时使用类限定符
public:
	A(void) :mx(20), my(30) {}
	~A(void) {}
private:
	int mx;
	int my;
};
//B.cpp
#include "B.h"  
#include "A.h"  //注意同时包含类A的头文件
int B::func(A xx)
{
	return xx.mx * xx.my;
}
//main.cpp
#include "A.h"
#include "B.h"
#include <iostream>
using namespace std;
void main()
{
	A a;
	B b;
	cout<<b.func(a)<<endl;
	system("pause");
}

VS19报错E0265,C2653,C2248

在B.h头文件中误包含A的头文件:#include “A.h”

//B.h
#pragma once 
#include "A.h"
class A;  
class B  
{  
public:  
    B(void);  
    ~B(void);  
    int func(A xx);  
};

在这里插入图片描述
报错显示私有成员无法访问,B不是一个命名空间或类,A.mx,A.my不能是私有成员这三个问题。也就是说包含头文件后,只能访问类A的公有成员。

VS19报错C2027,E0256

对B…h和B.cpp文件做如下修改,将cpp文件中func函数体移动到h文件

//B.h
#pragma once 
class A;  
class B  
{  
public:  
	B(void) {};
	~B(void) {};
    int func(A xx) { return xx.mx * xx.my; }
};
//B.cpp
#include "B.h"  
#include "A.h"  

在这里插入图片描述
这里有一个报错是A是未定义的类,不难理解在B.h文件中没有包含A.h,所以会有这个报错。那么在B.h中加上#include "A.h"呢?

#pragma once 
#include "A.h"
class A;  
class B  
{  
public:  
	B(void) {};
	~B(void) {};
    int func(A xx) { return xx.mx * xx.my; }
};

在这里插入图片描述
报错反而更多了。
因此在使用友元函数过程中应该严格遵循使用标准,注意类前向声明,不能多包含头文件,也不能将函数定义放头文件中

正确代码参考自https://blog.csdn.net/ddupd/article/details/38053159

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值