MOOC清华《面向对象程序设计》第4章编程题:按照调试级别输出调试信息

本文主要是介绍MOOC清华《面向对象程序设计》第4章编程题:按照调试级别输出调试信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

在程序中输出一些信息,是一种很有效的调试方法。请设计实现一个名为Log的类,能方便输出调试信息,要求满足如下附件所写的要求:



我的答案:

//main.cpp
#include <iostream>
#include "Log.h"
using namespace std;int main() {Log obj;obj.set_level("error");obj << level("warning");obj << level("fatal");return 0;
}

//Log.h
#ifndef Log_h
#define Log_hclass Log{char* std_str;
public:int set_level(char* str1);Log& operator<< (int level_num);
};int level(char* str2);#endif

Log.cpp
#include <iostream>
#include <cstring>
#include <string>
#include "Log.h"
using namespace std;int Log::set_level(char* str1){std_str = str1;if(strcmp(std_str, "warning") == 0) return 1;if(strcmp(std_str, "error") == 0) return 2;if(strcmp(std_str, "fatal") == 0) return 3;
}int level(char* str2){if(strcmp(str2, "warning") == 0) return 1;if(strcmp(str2, "error") == 0) return 2;if(strcmp(str2, "fatal") == 0) return 3;
}Log& Log::operator<< (int level_num){Log obj;if(level_num < obj.set_level(std_str)) return *this;if(level_num >= obj.set_level(std_str)){if(level_num == 1) cout << "WARNING MESSAGE" << endl;if(level_num == 2) cout << "DEBUG MESSAGE" << endl;if(level_num == 3) cout << "BROKEN" << endl;return *this;} 	
}

编译器信息:


输出结果:


调试了两天、最终解出这一题的经验总结:

1,不要随便用const,不是所有函数都适合用const修饰的,一修饰就会有某些限定,容易出bug;

2,成员函数可以重载,普通函数也可以重载,但是重载的条件是形参列表有不同,而不是返回值类型有不同;

3,是基本类型的变量,还是指向基本类型变量的指针变量,要区分清楚;

4,哪些成员需要私有,哪些成员需要公有,需要斟酌;

5,哪些变量需要全局化,哪些变量需要局部化,需要斟酌;

6,程序在修改调试阶段,尽可能保留每次修改的痕迹,否则把正确的代码改掉了,再想找回来很难;

7,这道题的描述中,插入流运算符<<应该连续输出 obj << level("warning") << "WARNING MESSAGE" << endl;并把level("warning")作为是否输出后面"WARNING MESSAGE"的控制符,但是我到现在还没有想到怎么做,头文件iostream里面的控制符列表中似乎也没有含有这种功能的控制符。期待能见到高人的解答。

=====================分割线=====================

今天又想到了一招,可以向题目要求再逼近一步!方法就是对输出流运算符重载,可以处理题目要求中带双引号部分的内容,而不会引起报错。

//main.cpp
#include <iostream>
#include "Log.h"
using namespace std;int main() {Log obj;obj.set_level("error");obj << level("warning") << "WARNING MESSAGE";obj << level("fatal") << "BROKEN";return 0;
}

//Log.h
#ifndef Log_h
#define Log_hclass Log{char* std_str;
public:int set_level(char* str1);Log& operator<< (int level_num);Log& operator<< (char* str3);
};int level(char* str2);#endif

//Log.cpp
#include <iostream>
#include <cstring>
#include <string>
#include "Log.h"
using namespace std;int Log::set_level(char* str1){std_str = str1;if(strcmp(std_str, "warning") == 0) return 1;if(strcmp(std_str, "error") == 0) return 2;if(strcmp(std_str, "fatal") == 0) return 3;
}int level(char* str2){if(strcmp(str2, "warning") == 0) return 1;if(strcmp(str2, "error") == 0) return 2;if(strcmp(str2, "fatal") == 0) return 3;
}Log& Log::operator<< (int level_num){Log obj;if(level_num < obj.set_level(std_str)) return *this;if(level_num >= obj.set_level(std_str)){if(level_num == 1) cout << "WARNING MESSAGE" << endl;if(level_num == 2) cout << "DEBUG MESSAGE" << endl;if(level_num == 3) cout << "BROKEN" << endl;return *this;} 	
}Log& Log::operator<< (char* str3){return *this;
}



至于输出流运算符后面如果跟endl该怎么处理,目前真不知道如何解决。endl并不等于'\n',也不知道具体的数据类型,束手无策,目前只能做到这一步了。

这篇关于MOOC清华《面向对象程序设计》第4章编程题:按照调试级别输出调试信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/727870

相关文章

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring