在尝试写成员函数作友元时,发现我提前声明了但还是不能识别出后面创建的类,去问了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;
}
};
但是暂时我没法实现,不知道是本来就不可以还是我的方式错误了。那就留到之后吧