想要使类GoodGay中的成员函数Visit(),访问Building类中的私有内容,代码如下
//GoodGay 类
class Building;
class GoodGay
{
public:
GoodGay();
void Visit();
void Visit2();
private:
Building * b;
};
GoodGay::GoodGay()
{
b = new Building;//new Building 相当于在堆区创建了一个Building对象,并且用指针指向了这个对象。
}
void GoodGay::Visit()
{
cout << b->SittingRoom << endl;
cout << b->BedRoom << endl;
}
void GoodGay::Visit2()
{
cout << b->SittingRoom << endl;
}
//Building 类
class Building
{
friend void GoodGay::Visit();
public:
string SittingRoom;
private:
string BedRoom;
public:
Building();
};
Building::Building()
{
SittingRoom = "asfad";
BedRoom = "asdsad";
}
//
//GoodGay::GoodGay()
//{
// b = new Building;//new Building 相当于在堆区创建了一个Building对象,并且用指针指向了这个对象。
//}
//
//void GoodGay::Visit()
//{
// cout << b->SittingRoom << endl;
// cout << b->BedRoom << endl;
//}
//
//void GoodGay::Visit2()
//{
// cout << b->SittingRoom << endl;
//}
void Test01()
{
GoodGay g;
g.Visit();
g.Visit2();
}
int main()
{
Test01();
system("pause");
return 0;
}
报错
我明明在class GoodGay前面声明class Building;了呀!,怎么会未定义呢。后来我又尝试将两个类的位置换一下,结果还是报同样的错误。后来查阅得知
GoodDay前面的Building声明,是一个前向声明,前向声明的用法:
1.用来定义指向该类型的指针或引用。如:Building * b;
2.声明该类型作为形参类型或返回类型:
如:void test(Building & b)//作为形参类型
Building test(。。。。)//作为返回类型
在声明之后,定义之前,Building是一个不完全类型,我们只知道有Building这么一个类,但不知道这个类里有什么具体的成员。
GoodGay中的
GoodGay();
void Visit();
void Visit2();
这三个成员函数,都已经用到了Building中的具体成员了。
我都不知道Building中有什么呢!你就开始用了!?所以我们需要保证,在这三个函数的具体实现之前,Building已经被完全定义完毕。因此我们可以采用类内声明,类外实现的方式。我们将这三个函数的实现,放到Building之后,这样不就行了吗!
这个问题实际上就是一个顺序问题,“用它之前,你得先有他”,我们不能使用一个不存在的东西。
主要参考这位朋友的博客,他讲的很清楚,比我清楚!:C++ 成员函数做友元遇到的问题 (错误C2027:使用了未定义类型)_纯白棒球帽的博客-CSDN博客_成员函数做友元报错