HM176 调用才装配

HM176 调用才装配

HM176 调用才装配

来源: 第 176 集 模板-类模板中成员函数创建时机

难度: 普及-

时间限制: 1s

空间限制: 64MB

题目描述

普通类的成员函数在类定义时就会创建。类模板里的成员函数**不一样**:一开始并不创建,**调用时**才实例化。原因是成员里往往有一个类型未定的对象,只有实例化并调用后,编译器才知道它到底是什么类型、能不能调某个接口。

因此下面这样的类模板可以先通过编译(只要你不去调用对不上的那个函数):

  • Person1 只有 showPerson1()
  • Person2 只有 showPerson2()
  • 类模板 MyClass<T> 有成员 obj(类型为 T),function1() 里写 obj.showPerson1()function2() 里写 obj.showPerson2()

若写成 MyClass<Person1>,只能调用 function1();调用 function2() 会在实例化时报错(Person1 没有 showPerson2)。MyClass<Person2> 则只能调用 function2()

请按上述结构实现,并处理询问:

  • 操作 \(1\):用 MyClass<Person1> 保存整数 \(x\),只调用 function1(),输出 person1: 与 \(2x\)(中间无空格)。
  • 操作 \(2\):用 MyClass<Person2> 保存整数 \(x\),只调用 function2(),输出 person2: 与 \(x+3\)(中间无空格)。

不要去调用类型对不上的那个成员函数。

输入格式

第一行一个整数 \(q\)(\(1 \le q \le 1000\))。

接下来 \(q\) 行,每行两个整数 \(op, x\)(\(op \in \{1,2\}\),\(\lvert x\rvert \le 10^6\))。

输出格式

共 \(q\) 行,每行对应一次调用的输出。

样例

输入 #1

3
1 10
2 7
1 -3

输出 #1

person1:20
person2:10
person1:-6

输入 #2

2
2 0
1 0

输出 #2

person2:3
person1:0

说明

MyClass 里两个成员函数可以同时写在类中,未调用就不会创建,因此整份代码能编译。一旦调用,才会检查 obj 是否真有对应接口。Person1Person2 是普通类,它们的成员函数一开始就会创建。

信息

ID
1175
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者