C++中成员函数作友元的限制

本文讲述了作者在C++中尝试让Goodgay类的成员函数访问Building类的私有成员时遇到的问题,尽管提前声明了Goodgay,但友元访问仍受限制。ChatGPT解释了前向声明无法满足友元访问的要求,且访问类内的成员对象必须在类完全定义后进行。
摘要由CSDN通过智能技术生成

在尝试写成员函数作友元时,发现我提前声明了但还是不能识别出后面创建的类,去问了chatgpt(chatgpt你是我的神!今天一天就被chatgpt拯救了两个困扰我的问题哈哈哈)

在你的代码中,你定义了一个 Building 类和一个 Goodgay 类,并将 Goodgay 类的成员函数 visit1 声明为 Building 类的友元函数。但是在实际调用 visit1 函数时,仍然无法访问 Building 类的私有成员 m_bedroom,导致程序出现问题。

问题出在 Building 类的友元声明上。在你的代码中,你尝试在 Building 类中提前声明 Goodgay 类,以便在 Goodgay 类中使用 Building 类的私有成员。然而,C++ 中的前向声明并不能满足这种情况下的友元访问要求。

这是chatgpt告诉我的。

1.在C++中,即使已经前置声明,也不可以进行友元访问。我先定义了Building,再是Goodgay,即使在类Building前写了Goodgay的声明,也无法在Building中写friend Goodgay...,编译器依旧识别不了这里面的友元成员函数。

2.我将Goodgay类提前之后,里面有一个成员函数visit,是用来访问Building中的一个成员对象的,我也写了Building的声明。此时编译器又在莫名其妙的报错。实际上是因为这里面的Building成员还没有被定义出来。

也就是说,提前声明可以让Goodgay在写成员对象时使用之后创建的Building类,但是不可以使用类里面的成员对象。

class Building;
class Goodgay
{
public:
	Goodgay();
	Building* m_b;//这里用指针才可以new出来
	void visit();
	void visit1();//让visit1访问到building私有成员
	void visit2();//让visit2访问不到
};
class Building
{
	//friend class Goodgay;
	friend void Goodgay::visit1();
public:
	Building();
	string m_sittingroom;
private:
	string m_bedroom;
};
void Goodgay::visit()
{
	cout << "好兄弟正在访问" << m_b->m_sittingroom << endl;
	//cout << "好兄弟正在访问" << m_b->m_bedroom << endl;
}

Goodgay::Goodgay()//初始化goodgay类,创建出一个building对象
{
	m_b = new Building();
}

Building::Building()//初始化building类
{
	m_sittingroom = "客厅";
	m_bedroom = "卧室";
}

void test01()
{
	Goodgay gay;
	gay.visit();
}
//3.成员函数作友元
void Goodgay::visit1()
{
	cout << "好兄弟1正在访问" << m_b->m_sittingroom << endl;
	cout << "好兄弟1正在访问" << m_b->m_bedroom << endl;
}
void Goodgay::visit2()
{
	cout << "好兄弟2正在访问" << m_b->m_sittingroom << endl;
	//cout << "好兄弟2正在访问" << m_b->m_bedroom << endl;
}
void test02()
{
	Goodgay gg;
	gg.visit1();
	gg.visit2();
}
int main()
{
	//test01();
	test02();
	//我服了爸爸好难怎么会这样我还以为做得出来
	return 0;
}

其实我在思考可不可以提前声明类中的某个成员对象??来解决这个问题

类似这样

class Building::m_sittingroom;
class Goodgay
{
public:
	Goodgay();
	Building* m_b;//这里用指针才可以new出来
	void visit()
	{
		cout << "好兄弟正在访问" << m_b->m_sittingroom << endl;
		//cout << "好兄弟正在访问" << m_b->m_bedroom << endl;
	}
};

但是暂时我没法实现,不知道是本来就不可以还是我的方式错误了。那就留到之后吧

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值