HM181 双通道探视

HM181 双通道探视

HM181 双通道探视

来源: 第 181 集 模板-类模板与友元

难度: 普及-

时间限制: 1s

空间限制: 64MB

题目描述

类模板也可以把全局函数声明为友元,用来访问私有成员。有两种写法。

类内实现(推荐): 在类里写 friend 并直接给出函数体。参数用参数模板化,例如 friend void printPerson(Person<T1, T2> p)。编译器能直接识别,没有特殊需求时用这个即可。

类外实现(更绕): 只在类里留友元声明,函数体写在类外。要注意:

  1. 这是全局函数,类外实现**不要**加 Person:: 作用域。
  2. 类外实现带 template<class T1, class T2>,它是函数模板;类里若写成普通函数声明,两边对不上,链接会失败。
  3. 类内声明要加空模板参数列表:friend void printPerson2<>(Person<T1, T2> p);,表明声明的也是函数模板。
  4. 编译器必须**提前**看到:类模板 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
通过率
?
上传者