记录日志
题目描述
ILogger
接口提供 log
“记录日志”成员函数。
给出三个实现 ILogger
接口的类:TermLogger
、StrLogger
与 SumLogger
。
TermLogger
在记录日志时,直接将值打印到标准输出,并尾随一个换行;StrLogger
可通过print
方法,将所有已经记录下来的值拼接为一个字符串,然后输出;SumLogger
可通过print
方法,将所有已经记录下来的值加起来的和输出。
关于输入
共一行,为若干个空格分隔的整数 {ai}n。0 ≤ ai < 100,n < 1000。
关于输出
共 n + 2 行。
对于前 n 行,第 i 行即为 ai;
第 n + 1 行为 {ai} 所有数按序排列,无分隔符;
第 n + 2 行为 {ai} 所有数的和,保证结果在 int 范围内。
代码说明
StrLogger
可以有多个不同实现:
- 每次
log
时,将数值存放在std::vector
内,最后在print
方法中逐个输出; - 每次
log
时,调用std::to_string
转换为字符串,增加到内部成员结尾; - 同上,但是使用
std::stringstream
做转换。
参考答案
#include <iostream>
#include <string>
class ILogger {
public:
virtual void log(int) = 0;
};
#include <vector>
class TermLogger : public ILogger {
public:
void log(int i) override {
std::cout << i << std::endl;
}
};
class StrLogger : public ILogger {
std::vector<int> nums;
public:
void log(int i) override {
nums.push_back(i);
}
void print() {
for (auto i : nums) {
std::cout << i;
}
std::cout << std::endl;
}
};
class SumLogger : public ILogger {
int sum{};
public:
void log(int i) override {
sum += i;
}
void print() {
std::cout << sum << std::endl;
}
};
int main() {
TermLogger termLog;
StrLogger strLog;
SumLogger sumLog;
ILogger* loggers[]{&termLog, &strLog, &sumLog};
int num;
while (std::cin >> num) {
for (auto logger : loggers) {
logger->log(num);
}
}
strLog.print();
sumLog.print();
}
#include <iostream>
#include <string>
class ILogger {
public:
virtual void log(int) = 0;
};
class TermLogger : public ILogger {
public:
void log(int i) override {
std::cout << i << std::endl;
}
};
class StrLogger : public ILogger {
std::string str;
public:
void log(int i) override {
str += std::to_string(i);
}
void print() {
std::cout << str << std::endl;
}
};
class SumLogger : public ILogger {
int sum{};
public:
void log(int i) override {
sum += i;
}
void print() {
std::cout << sum << std::endl;
}
};
int main() {
TermLogger termLog;
StrLogger strLog;
SumLogger sumLog;
ILogger* loggers[]{&termLog, &strLog, &sumLog};
int num;
while (std::cin >> num) {
for (auto logger : loggers) {
logger->log(num);
}
}
strLog.print();
sumLog.print();
}
#include <iostream>
#include <string>
class ILogger {
public:
virtual void log(int) = 0;
};
#include <sstream>
class TermLogger : public ILogger {
public:
void log(int i) override {
std::cout << i << std::endl;
}
};
class StrLogger : public ILogger {
std::string str;
public:
void log(int i) override {
std::stringstream ss;
ss << i;
str += ss.str();
}
void print() {
std::cout << str << std::endl;
}
};
class SumLogger : public ILogger {
int sum{};
public:
void log(int i) override {
sum += i;
}
void print() {
std::cout << sum << std::endl;
}
};
int main() {
TermLogger termLog;
StrLogger strLog;
SumLogger sumLog;
ILogger* loggers[]{&termLog, &strLog, &sumLog};
int num;
while (std::cin >> num) {
for (auto logger : loggers) {
logger->log(num);
}
}
strLog.print();
sumLog.print();
}