本人在写类成员函数做友元时遇到了 使用未定义类名的情况,不论如何调节Building类和GoodGay类的位置都说使用未定义类,事先声明了GoodGay类也没用,错误如下:
错误源码如下:
# include <iostream>
# include <string>
using namespace std;
class GoodGay; //声明Goodgay类
class Building
{
friend void GoodGay::visit(); //未给出定义便使用GoodGay导致编译器报错
public:
Building()
{
settingroom = "客厅";
bedroom = "卧室";
}
public:
string settingroom;
private:
string bedroom;
};
//此刻Building给出了完整定义,但GoodyGay还未给出定义
class GoodGay
{
public:
Building* building;
GoodGay()
{
building = new Building; //Building类实列化
}
void visit()
{
cout << "访问:" << building->settingroom << endl;
cout << "访问:" << building->bedroom << endl;
}
};
//此刻Goody才完整给出定义
int main()
{
GoodGay gg;
gg.visit();
return 0;
}
经过一段时间的摸索,并结合**C++:成员友元函数(成员函数友元化)**我终于找到了错误原因。
在Building类中使用GoodGay的Vist方法时,因GoodGay类未给出完整定义,使得在编译过程时编译器会报错。
😊解决步骤如下:
1. 声明类友元函数所在类B;
2. 定义不是类友元函数所在类A,但不要实现函数,只定义即可;
3. 定义类友元函数所在类B,可实现方法;
4. 实现不是类友元函数所在类A的方法,具体实现方式未:数据类型 类::函数(参数)
正确源码如下:
# include <iostream>
# include <string>
using namespace std;
class Building; //声明类友元函数所在类
class GoodGay //定义不是类友元函数所在类
{
public:
Building* building;
GoodGay();
void visit();
};
class Building //定义类友元函数所在类
{
public:
friend void GoodGay::visit(); //类友元函数所在位置
Building()
{
settingroom = "客厅";
bedroom = "卧室";
}
public:
string settingroom;
private:
string bedroom;
};
//实现不是类友元函数所在类的方法
GoodGay::GoodGay() {
this->building = new Building();
}
void GoodGay::visit() {
cout << building->settingroom << endl;
cout << building->bedroom << endl;
}
int main()
{
GoodGay gg;
gg.visit();
system("pause");
return 0;
}
结果如下:
友元使用很奇妙,希望各位看官能指出不足之处,在此谢过大家!!!!