成员函数作为友元

想要使类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博客_成员函数做友元报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值