HM120 好朋友探楼
HM120 好朋友探楼
来源: 第 120 集 类和对象-友元-成员函数做友元
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
友元可以把某个全局函数、某个类、或**某个类的成员函数**指定为另一个类的好朋友,从而允许它访问对方的私有成员。普通成员函数做不到这一点。
请实现建筑物类型 Building 和好朋友类型 GoodGay,并遵守下列约定(对应成员函数友元的完整写法):
- 先前置声明
Building,再定义GoodGay,最后定义Building。GoodGay内部用建筑物指针维护一座楼。 GoodGay的构造函数必须在堆区new出一座Building,由该指针持有。Building有公共成员「客厅」和私有成员「卧室」,构造时分别写入给定的两个名称。- 成员函数一律写成**类内声明、类外实现**(用
类名::给出作用域)。 GoodGay::visit是Building的友元成员函数:声明必须写成friend void GoodGay::visit();。只写friend void visit();会被当成全局函数友元,不能代表成员函数。GoodGay::visit2不是友元。它可以读客厅(公共),但绝不能读卧室(私有)。若也要让它读卧室,必须再单独做一次友元声明;本题不做。
读入客厅名、卧室名和若干次探访。每次探访调用 visit 或 visit2,按下面格式输出它实际访问到的房间。
输入格式
第一行两个不含空白的字符串 \(s\)、\(b\),分别是客厅名称和卧室名称(长度 \(1\sim 20\))。
第二行一个整数 \(q\)(\(1 \le q \le 1000\))。
接下来 \(q\) 行,每行一个整数 \(t\)(\(t\in\{1,2\}\)):
- \(t=1\):调用
visit(友元,访问客厅和卧室) - \(t=2\):调用
visit2(非友元,只访问客厅)
输出格式
对每次探访按访问到的房间各输出一行,行末换行:
- \(t=1\) 先输出
visit s,再输出visit b - \(t=2\) 只输出
visit2 s
其中 \(s\)、\(b\) 是输入给出的客厅名和卧室名,中间一个空格。
样例
输入 #1
客厅 卧室
3
1
2
1
输出 #1
visit 客厅
visit 卧室
visit2 客厅
visit 客厅
visit 卧室
输入 #2
Hall Bed
2
2
1
输出 #2
visit2 Hall
visit Hall
visit Bed
说明
- 客厅是公共成员,
visit与visit2都能访问。 - 卧室是私有成员,只有被声明为友元的
GoodGay::visit能访问;visit2访问卧室无法通过编译。 - 样例 #1:友元探访客厅和卧室两间,普通成员只探客厅。
- 必须用成员函数友元访问私有卧室,不能把卧室改成公共,也不能把整座楼的内容提前拷到
GoodGay里再打印。
信息
- ID
- 1119
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者