C++中类成员函数做友元函数为什么报错?

最近在使用友元函数来访问私有成员时,遇到了问题,用一个类成员函数做另一个类的友元函数,但是一直报错,提示为定义其中的一个类型,思考良久(思路:既然友元函数在公有访问权限内,就应该可以访问私有数据成员),在网上搜了很多的博客,但是都没有明确的答案,还好最后自己解决了问题,下面写一下自己解决问题的过程,根据个人的理解写了一下注释(也不知道理解的对不对),大家如果有明确答案的请给我反馈一下,谢谢!

#include<iostream>
using namespace std;
class test1;//声明标识符
class test2
{
public:
	int c;
	void fun(test1&t);//函数的声明
private:
	int d;
};
void test2::fun(test1&t)//函数的定义(错误的根源)
{
	cout << t.a << endl;
	cout << t.b << endl;
}
class test1
{
public:
	int a;
	friend void test2::fun(test1&t);//友元函数的声明
private:
	int b;
};

int main()
{


}

以上代码会报错,错误“error C2027: 使用了未定义类型“test1”,明明已经定义了test1类型,而且还提前声明了,为什么会提示未定义呢?就是找不到问题,最后将函数的定义放到最后就解决了问题,代码如下:

#include<iostream>
using namespace std;
class test1;//标识符
class test2
{
public:
	int c;
	void fun(test1&t);//函数声明
private:
	int d;
};
/*void test2::fun(test1&t)//
{
	cout << t.a << endl;//此处要知道test1类型的具体内容,
但是系统并不知道,虽然在上面声明的该类型,
但是我们不知道具体内容,具体内容在下面才给出,
所以会报错,提示未定义类型test1(我个人理解是这样的),
所以将该函数移动到test1类型后面就不报错了,
(个人理解,仅供参考,不一定正确)
	cout << t.b << endl;
}*/
class test1
{
public:
	int a;
	friend void test2::fun(test1&t);//友元函数声明
private:
	int b;
};
void test2::fun(test1&t)//函数定义放在最后(问题解决了)
{
	cout << t.a << endl;
	cout << t.b << endl;//私有成员会提示“无法访问私有成员”,
这只是编译器的没有识别出来,但是不影响编译,可以通过编译,我们不用理会。
}
int main()
{


}

个人理解都在代码的注释中阐述了,仅仅是个人理解,仅供参考,不一定正确,但是确实解决了问题。(如果有明确的理解,请帮忙反馈一下,谢谢!)

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值