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

相关文章

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow