HM181 双通道探视
HM181 双通道探视
来源: 第 181 集 模板-类模板与友元
难度: 普及-
时间限制: 1s
空间限制: 64MB
题目描述
类模板也可以把全局函数声明为友元,用来访问私有成员。有两种写法。
类内实现(推荐): 在类里写 friend 并直接给出函数体。参数用参数模板化,例如 friend void printPerson(Person<T1, T2> p)。编译器能直接识别,没有特殊需求时用这个即可。
类外实现(更绕): 只在类里留友元声明,函数体写在类外。要注意:
- 这是全局函数,类外实现**不要**加
Person::作用域。 - 类外实现带
template<class T1, class T2>,它是函数模板;类里若写成普通函数声明,两边对不上,链接会失败。 - 类内声明要加空模板参数列表:
friend void printPerson2<>(Person<T1, T2> p);,表明声明的也是函数模板。 - 编译器必须**提前**看到:类模板
Person的前向声明、函数模板printPerson2的前向声明,然后再写类定义和类外实现。
请实现 Person<T1, T2>:姓名、年龄为**私有**成员;有参构造公有。提供:
- 类内友元
printPerson:输出in 姓名:姓名年龄:年龄。 - 类外友元
printPerson2:输出out 姓名:姓名年龄:年龄。
读入 \(n\) 个人,每人一个通道 \(k\):\(k=1\) 走类内友元,\(k=2\) 走类外友元。两种都要真正实现。
输入格式
第一行一个整数 \(n\)(\(1 \le n \le 1000\))。
接下来 \(n\) 行,每行:整数 \(k\)、不含空白的姓名、整数年龄。\(k \in \{1,2\}\),姓名长度 \(1\sim 20\),年龄为 \(1\sim 10^6\)。
输出格式
共 \(n\) 行,格式随通道而定。
样例
输入 #1
2
1 Tom 20
2 Jerry 20
输出 #1
in 姓名:Tom 年龄:20
out 姓名:Jerry 年龄:20
输入 #2
1
2 Anna 18
输出 #2
out 姓名:Anna 年龄:18
说明
私有成员只能由友元或成员函数访问。没有特殊需求时用类内友元即可;类外友元必须先让编译器看到类和函数模板的存在。
信息
- ID
- 1180
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者