C++小白,学习C++的第六天,和大家分享一下今天学到的C++中的“友元”,以及在定义多个类时为什么会出现“使用了未定义的类型”的错误。
//友元
友元的概念:
在使用C++的过程中,我们有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁访问类的私有(private)成员和保护(protected)成员,这时可以将这些函数定义为友元函数。
而除了友元函数,还有友元类,两者统称为友元(friend)。
借助友元,可以使得普通函数或其他类中的成员函数可以访问某个类的私有成员和保护成员。
- 友元函数:普通函数可以访问某个类私有成员或保护成员。
- 友元类:类A中的成员函数可以访问类B中的私有或保护成员。
1.全局函数做友元
2.类做友元
3.成员函数做友元
1.全局函数做友元
2.类做友元
class Building;
class GoodGay
{
public:
GoodGay()
{
b2 = new Building;
}
void visit1()
{
cout << "好基友类正在访问:" << b2->m_LivingRoom << endl;
cout << "好基友类正在访问:" << b2->m_BedRoom << endl;
}
Building* b2;
};
class Building
{
friend void visit(Building* building); //全局函数做友元,让这个函数可以访问到Building类的私有成员
friend class GoodGay;//类做友元,让这个类可以访问到Building类的私有成员
public:
Building()
{
m_LivingRoom = "客厅";
m_BedRoom = "卧室";
}
//Building* building;
public:
string m_LivingRoom;
private:
string m_BedRoom;
};
void visit(Building* building)
{
cout << "全局函数正在访问:" << building->m_LivingRoom << endl;
cout << "全局函数正在访问:" << building->m_BedRoom << endl;
}
void test1()
{
Building b1;
visit(&b1);
}
void test2()
{
GoodGay g1;
g1.visit1();
基于上述的代码,当我们在main函数中调用test1和test2函数时,会发现我们可以访问到Building类中的私有成员,这就是因为我们把上述代码中的全局函数和GoodGay类设置成了“朋友”,让他们不仅可以“进客厅”,还可以“进卧室”。
3.成员函数做友元
//3.成员函数做友元
class Building;//提前声明一个类,等写完GoodGay类时再去实现它。
class GoodGay
{
public:
void visit2();
void visit3();
GoodGay();
Building* b2;
};
class Building
{
friend void GoodGay::visit2();//成员函数做友元,让这个函数可以访问到Building类的私有成员
public:
Building()
{
m_LivingRoom = "客厅";
m_BedRoom = "卧室";
}
public:
string m_LivingRoom;
private:
string m_BedRoom;
};
//类外初始化
GoodGay::GoodGay()
{
b2 = new Building;
}
void GoodGay::visit2()
{
cout << "好基友类正在访问:" << b2->m_LivingRoom << endl;
cout << "好基友类正在访问:" << b2->m_BedRoom << endl;
}
void GoodGay::visit3()
{
cout << "好基友类正在访问:" << b2->m_LivingRoom << endl;
//cout << "好基友类正在访问:" << b2->m_BedRoom << endl;
}
void test1()
{
Building b1;
visit(&b1);
}
void test2()
{
GoodGay g1;
g1.visit2();
g1.visit3();
}
int main()
{
test2();
system("pause");
return 0;
}
当我们在调用GoodGay类中的visit2函数时,我们发现,visit2函数也可以正常的访问客厅与卧室,而visit3函数则只能访问客厅而不能访问卧室。这就是因为我们在Building类中将GoodGay类的visit2成员函数设置成了朋友(添加“friend”关键字),但是,假如我们将GoodGay类在类外实现的函数放到Building类的上方实现时,运行代码,会出现“使用未定义的类型”的错误。
这是为什么呢?
这是因为:在类中只要涉及到还没有实现的类的函数,要先声明,然后在类的最后实现,且实现的位置要在依赖类实现的下方。
这就是我关于C++“友元”和出现“使用了未定义类型”错误的理解。
因为是刚学,如有错误,欢迎指正!
祝大家变得更强!