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