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