-
2.继承
-
3.多态
-
二、实现一个登录器将输入的密码隐层起来
-
- 1.前置知识
-
- ① getch() 无回显键入
-
② \b 退格
-
2.效果展示
-
- ① 密码加密
-
② 登录成功
-
③ 登录失败
-
3.实现方法
-
三、程序运行截图
-
- 1.主题设置
-
2.主菜单
-
3.用户操作界面
-
4.管理员操作界面
-
5.登录注册界面
-
6.查阅图书
-
四、项目中包含的类及其作用
-
- 1.信息节点类
-
2.链表基类
-
3.用户链表类
-
4.管理员链表类
-
5.图书节点类
-
6.图书链表类
-
7.用户借记节点类
-
8.用户借记链表类
-
9.多态的实现
-
10.其余全局增删改查函数
-
五、源代码及项目及项目结构
-
- 项目结构
-
源代码
-
总结
-
-
- 关注冲哥不迷路!
-
====================================================================
在步入大学的时候学的第一门面向对象的语言就是C++,一度被他的语法与设计模式所吸引,本篇博客将介绍一下博主在学习完C++基础语法的时候写的小项目,基于C++三大特性的图书管理系统,这次的小练习会对类的属性进行封装,使用继承与多态完成一个登录器登录不同的角色。
===============================================================================
在C++中类的封装完成的一个任务就是实现类的私有属性能够在外界访问
在介绍C++基础语法的时候提到使用get方法获取私有属性,使用set方法
对私有属性进行赋值。所以今天项目中依旧使用这种方法。
本项目原理上不需要使用继承,但是为了实现多态,就使用上了继承.继承有
助于我们对类进行扩展,更是实现多态的一个必要条件。
顾名思义,就是一段代码实现不同的展示效果,通过基类的指针指向子类的对象
调用被重写的重名函数,实现多种表现。
=====================================================================================
① getch() 无回显键入
实现登录器首先要将输入的数据隐藏起来,然后再考虑使用*替换
getch这个函数是一个不回显函数,当用户按下某个字符时,函数
自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏
但是这个函数并非标准函数,要注意移植性!
② \b 退格
是ASCII表中的一个转义字符代表回退一格
我们使用 \b空格\b 达到将想要删除的字符进行覆盖
解释一下 \b空格 覆盖的是原来的一个字符
后面那个\b是将新键入的 backspace 字符覆盖掉
① 密码加密
② 登录成功
③ 登录失败
注意点都在代码的注释中
代码如下:
include
using namespace std;
include<conio.h>
int main() {
char passward[20];
int i = 0, j, k;
char ch = ‘0’;
cout << “请输入您的密码:”;
j = 0; k = 1;
i = 0;
memset(passward, ‘\0’, sizeof(passward));
while (1) {
ch = _getch();//最后输入回车没有将回车存入密码中,而是将他给吃掉了;
if (ch == 13) {//13在ASCII表中代表回车
break;
}
else {
if (ch != 8) {//代表键入删除键
if (i < 19) {//如果输入次数大于19就不再将从键盘读取的字符存进数组;
passward[i] = ch;
}
cout << “*”;
}
else {//其余任何键都将以*的形式打印
if (i == 0) {//如果没有键入就删除是不行的,需要加以限定让i回到0;
ch = ‘\0’;
i–;
}
else {
cout << “\b \b”;
passward[i - 1] = ‘\0’;
ch = ‘\0’;
i = i - 2;
}
}
}
i++;
}
cout << endl;
cout << “passward is : 123123” <<endl;
cout << "you put is " << passward << endl;
if (strcmp(passward, “123123”) == 0) {
cout << “密码正确” << endl;
}
else {
cout << “密码错误” << endl;
}
cout << endl;
return 0;
}
==========================================================================
用户与管理员公用,实现多态
这里图书的主键是书名与作者,只有书名与作者相同时才会触发查重机制
查重机制会在新增图书时触发自动合并。
===============================================================================
这里只讲函数的声明,具体的实现在源代码中
博主当时为了偷懒管理员与用户信息设置的是一个类作为节点,大家可以多实现几个类
添加几个不同的属性,节点类主要包含节点类与属性类,用于存储信息,组成链表。
class UaAdate {//------------------用户与管理员的资料-----------------------------
private:
string id;
string passward;
string secproblem;
string secanswer;
UaAdate* next;
public:
UaAdate() {
}
UaAdate(string ID, string Passward, string Secproblem, string Secanswer) {
id = ID;
passward = Passward;
secproblem = Secproblem;
secanswer = Secanswer;
}
void setpassward(string passward) {//--------------------------------------------设置密码
this->passward = passward;
}
void setnext(string id, string passward, string secproblem, string secanswer) {//设置下一节点
next= new UaAdate(id,passward,secproblem,secanswer);
next->next = NULL;
}
string getid() {//-----------------------------------------------------------------获取id
return this->id;
}
string getpassward() {//-----------------------------------------------------------获取密码
return this->passward;
}
string getsecproblem() {//--------------------------------------------------------获取密保问题
return this->secproblem;
}
string getsecanswer() {//---------------------------------------------------------获取密保答案
return this->secanswer;
}
UaAdate*& getnext() {//------------------------------------------------------------节点的指针域
return next;
}
};
链表基类的作用就是实现基类的指针指向子类的对象,实现多态
主要的功能是对链表的增删改查。
class baselink {//----------------------节点功能类-----------------------
public:
virtual void addnode(string id, string passward, string secproblem, string secanswer)=0;
virtual UaAdate* looklink(string id) = 0;
virtual void savelink() = 0;
virtual void printlink() = 0;
virtual void delnode(string id