C++ 友元
1. 成员函数做友元 (有大坑)
翻译:假设有A,B两类,A中的成员函数成为了B的友元,该函数就能访问B的私有属性。
首先声明定义A,B两个类 , 这里的先后顺序是有讲究的,必须要先声明被访问私有属性的类,此处为B;然后声明+定义私有属性访问者A。
class B;
class A
{
public:
A(); //A构造函数的定义要放到B类定义的后面
void visit();
B* b; //B类此时还是不完全类,可以声明但不能实例化
}
接着定义B
class B
{
friend void A::visit(); //核心代码
public:
B(){ //B的构造函数最好写一下,方便后面检测
m_Name = "zhangsan";
m_Age = 18;
};
stirng m_Name;
private:
int m_Age;
}
此时才能定义A的构造函数
A::A()
{
B b; //此时的B才是完整的,可以实例化了
}
接着补上成员函数visit的定义
void A::visit(){
cout << B->m_Name << endl;
cout << B->m_Age << endl;
}
最后写个main函数测试一下
int main()
{
A a;
a.visit();
return 0;
}
本次主要讨论的是A类创建B类,且A中有成员函数为B的友元的情况,除了友元外还涉及到两类创建先后的问题。
类是可以提前声明的,但只声明未定义的类还不完整,此时只能用指针指向它或者引用它,不能实例化。
友元函数要访问类中的属性前也要保证该类已经被定义了,不然函数会找不到该属性。
2. 全局函数做友元
先定义一个全局类,再定义一个全局函数,最后在类中写个友元声明就可以了
class A
{
friend void visit(A *a); //核心代码
public:
string m_Name;
private:
m_Age;
}
void visit(A *a){
cout << a->m_Name << endl;
cout << a->m_Age << endl;
}
3. 类做友元
class B;
class A
{
public:
A(); //A构造函数的定义要放到B类定义的后面
void visit();
B* b; //B类此时还是不完全类,可以声明但不能实例化
}
class B
{
friend class A; //核心代码
public:
B(){ //B的构造函数最好写一下,方便后面检测
m_Name = "zhangsan";
m_Age = 18;
};
stirng m_Name;
private:
int m_Age;
}
A::A()
{
B b; //此时的B才是完整的,可以实例化了
}
void A::visit(){
cout << B->m_Name << endl;
cout << B->m_Age << endl;
}