作者:hi347 | 来源:互联网 | 2023-10-11 14:09
文章参考:【C++】错误C2027:使用了未定义类型错误原因
文章目录
- 0 友元
- 1 全局函数作友元
- 2 类作友元
- 3 成员函数作友元
0 友元
作用:在类中使用关键字friend
修饰类外某些函数或类的声明,使其可访问类中的私有成员。
友元的3种实现:
(1)全局函数作友元
friend 全局函数声明;
即friend 返回类型 友元全局函数名(类引用或类指针);
(2)类作友元
friend 类声明;
即friend class 友元类名;
(3)成员函数作友元
friend 友元成员函数所属类名::成员函数声明;
即friend 返回类型 友元成员函数所属类名::友元成员函数名(形参列表);
1 全局函数作友元
用法:friend 全局函数声明;
即friend 返回类型 友元全局函数名(类引用或类指针);
#include
using namespace std;
#include class House {friend void g_canVisit(House *pHouse);private:string bedroom;public:string livingroom;House();
};
House::House() {livingroom = "客厅";bedroom = "卧室";
}
void g_canVisit(House *pHouse) {cout << "正在访问&#xff1a;" << pHouse->livingroom << endl;cout << "正在访问&#xff1a;" << pHouse->bedroom << endl;
}int main() {House* house &#61; new House; g_canVisit(house); return 0;
}
2 类作友元
用法&#xff1a;friend 类声明;
即friend class 友元类名;
#include
using namespace std;
#include
class House;
class Family {
private:House* pHouse;public:Family();void canVisit();
};class House {friend class Family;private:string bedroom; public:string livingroom; House() {livingroom &#61; "客厅";bedroom &#61; "卧室";}
};
Family::Family() {pHouse &#61; new House;
}void Family::canVisit() {cout << "正在访问&#xff1a;" << pHouse->livingroom << endl; cout << "正在访问&#xff1a;" << pHouse->bedroom << endl;
}int main() {Family family;family.canVisit(); return 0;
}
3 成员函数作友元
用法&#xff1a;friend 友元成员函数所属类名::成员函数声明;
即friend 返回类型 友元成员函数所属类名::友元成员函数名(形参列表);
#include
using namespace std;
#include
class House;
class Family {
private:House *pHouse;public:Family();void canVisit();void canNotVisit();
};class House {friend void Family::canVisit();private:string bedroom; public:string livingroom; House() {this->livingroom &#61; "客厅";this->bedroom &#61; "卧室";}
};
Family::Family() {pHouse &#61; new House;
}
void Family::canVisit() {cout << "正在访问&#xff1a;" << pHouse->livingroom << endl; cout << "正在访问&#xff1a;" << pHouse->bedroom << endl;
}
void Family::canNotVisit() {cout << "正在访问&#xff1a;" << pHouse->livingroom << endl;
类的前向声明&#xff1a;
类在声明后、定义前&#xff0c;属于不完全类型&#xff08;incompete type&#xff09;&#xff0c;即已前向声明的类是一个类型&#xff0c;但所包含的成员未知&#xff0c;仅能以有限方式使用。
不完全类型可定义该类的指针、引用&#xff0c;以及声明&#xff08;并非定义&#xff09;将该类作为形参类型或返回类型的函数&#xff1b;但不能定义该类对象。