Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++:项目记录//类及对象的存储问题

C++:项目记录//类及对象的存储问题

作者头像
字节星球Henry
发布于 2021-08-09 08:46:02
发布于 2021-08-09 08:46:02
54700
代码可运行
举报
运行总次数:0
代码可运行

类与对象(面向对象编程)

OA 项目记录:2021-01-09

我的 OA 项目,从一月七号开始,这一两天都在写其注册,登录部分。

注册就涉及到数据的增加,登录就涉及到数据的验证,用户的鉴权,这些都是比较有难度的部分。

在 C 语言中,我们通常使用结构体来存储数据成员,比如 ID,姓名,职位等,而作为 C++,我们通常把这些数据作为数据成员写在中,而我们通过类来处理的该数据类型的变量这就是我们的对象。

这里我先说说什么是类,什么是对象:

属性可以看做为数据;行为可以抽象为函数。 对象是数据 和 函数 的集合。 类是指整个一类实物,一个类定义了一个模板; 类对数据以及处理数据的方式(函数)进行封装。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class userAccount
{
    public:
        void saveUserData(userAccount *head);
        int getGroup()
        {
            return group;
        }
        userAccount *loadUserData(userAccount* head);
        void signUp(int I,char* N,char* P,int G)
        {
            uid = I;
            strcpy(name, N);
            strcpy(password,P);
            group = G;
        }
        bool logIn(char *pass)
        {
            bool key = false;
            !strcmp(pass, password) ? key = true : key = false;
            if(key)
                return true;
            return false;
        }
        bool cheakUid(int id)//有重复ID返回真
        {
            bool key = false;
            id == uid ? key = true : key = false;
            if(key)
                return true;
            return false;
        }
        char* uName()
        {
            return name;
        }
        void print_userInf();
        string search_Situation()
        {
            switch(group)
            {
                case 1:
                    return "管理员";
                    break;
                case 2:
                    return "开发者";
                    break;
                case 3:
                    return "普通用户";
                    break;
                default:
                    return 0;
            }
        }
    int uid;
    userAccount *next = NULL;
    private:
        char name[10];
        char password[16];
        int group = 0;
};

这是我 OA 项目中对于用户账户的一个类 class userAccount,我把处理用户账户的函数封装在了里面,比如 saveUserData(),这个函数是将内存中链表的所有用户数据存储到数据文件中。用户的密码,姓名,组别则作为了 private 数据成员封装在了类中。

我们将处理这个对象的方法和这个对象的属性也就是数据封装在了一个类中,而形成了处理用户账户这个对象的方案模板,这就是面向对象编程

对象的存储问题

前面已经说到,C 语言中,我们通常使用结构体来存储数据成员,比如 ID,姓名,职位等,结构体里面存储的均是数据,我们可以很方便的使用文件相关函数,以二进制方法将结构体写入数据文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void save(int stuNum, long int key)
{
    FILE *fp;
    int i;
    if ((fp = fopen("students.dat", "wb")) == NULL)
    {
        printf("学生成绩数据库文件创建失败!\n");
        fclose(fp);
        exit(0);
    }
    s[1].keyword = key;
    for (i = 0; i < stuNum; i++)
    {
        if (fwrite(&s[i], sizeof(stu), 1, fp) != 1)
        {
            printf("学生成绩数据库文件写入失败。\n");
            fclose(fp);
            exit(0);
        }
    }
    printf("学生成绩数据库文件创建成功,请妥善保存students.dat文件!\n");
    fclose(fp);
}

这是我之前的学生成绩管理程序的文件写入方法。

在 C++ 中,对于一个对象,还能像结构体这样处理吗?不能,我之前说过,对象中不仅包含数据成员(我们需要存储的数据)同时也包含了处理数据的方法(成员函数),后者我们是不需要写入到二进制文件中的,我们只需要选择自己需要的数据成员进行存储,第二次打开程序在对其读写到内存中进行处理。

接下来,我们使用指向一个对象的类指针对数据进行处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void userAccount::saveUserData(userAccount* head)//保存内存中的整个链表,并覆盖文件./src/userData.dat
{
    ofstream openUserFile("./src/userData.dat", ios::binary|ios::out);
    if(!openUserFile.fail())
        {
            do{
            openUserFile.write((const char *)&head->uid, sizeof(head->uid));
            openUserFile.write((const char *)head->name, sizeof(head->name));
            openUserFile.write((const char *)head->password, sizeof(head->password));
            openUserFile.write((const char *)&head->group, sizeof(head->group));
            head = head->next;
            } while (head);
        }
    else {cout << "fault,code:fun_119." << endl;
        return;}
        openUserFile.close();
}

这是我 OA 项目中存储数据成员的方法,我们需要的数据有 UID、姓名、密码、用户组,通过传入的形参(userAccount 类的链表头指针)从头将每节链表的数据成员存储到二进制文件,直到链表中的 next 指针指向 NULL。

读取的时候通过相似的方式,用文件流 read 成员函数进行读写,直到 readUserFile.eof() 返回 TRUE。

注意,在文件写操作完成后,请对类指针所指向的内存堆释放,使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete[] p;
p = NULL;

注意:用 new ,一定要 delete..

不说了,腰有点疼...坐太久了。


编辑:Henry 2021-01-09 OA 项目记录

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言实现学生成绩管理系统
相关视频——https://www.bilibili.com/video/BV13z4y117qC?p=8 代码实现 #define _CRT_SECURE_NO_WARNINGS 1 #includ
半生瓜的blog
2023/05/12
3510
江哥带你玩转C语言 | 17-文件操作
如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是江哥持续更新的动力
极客江南
2021/07/11
1.1K0
2020_883《C程序设计》
答:在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符,C语言规定标识符只能由字母、数字、下划线3种字符组成,且第1个字符必须为字母或下划线。
石璞东
2021/12/02
6890
2020_883《C程序设计》
C语言开发简单的学生成绩管理系统(附源码)
(2)不修改函数,仅仅修改项目的属性。因为fopen_s是一种Microsoft的函数,若纯做Windows开发则直接改为_s也无妨,但是我们尽量还是用标准C++比较好,这样代码有较好的移植性。
全栈程序员站长
2022/08/28
1.4K0
C语言开发简单的学生成绩管理系统(附源码)
基于链表实现的学生管理系统
定义一个包含学生信息(学号,姓名,性别,专业,语数外成绩,平均分,成绩排名)的链表,使其具有如下功能:
用户10604450
2024/03/15
1540
基于链表实现的学生管理系统
用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程
第一次写这么长的代码,确实挺累的,但收获也不小,但是还有还不够完善,比如密码加密未完成,还有这个系统只能管理一个班级,若要实现多个班级的成绩管理就不嗯呢该完成了…… 最后的最后,这是我的第一篇博客,希望对浏览的人能有所帮助,也希望之后的自己能变得更好,加油!
全栈程序员站长
2022/09/27
5K0
用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程
C语言学生成绩管理系统详解[通俗易懂]
引言:最近写了C语言的大作业,感觉做得还行,记录一下,给后人一些参考,给自己留更深印象方便后续改进!
全栈程序员站长
2022/07/28
3K0
C语言学生成绩管理系统详解[通俗易懂]
练习题目“涨工资”
有一个员工文件salary_back.txt,salary_back.txt文件每行 为部门职员的姓名:工资(如tom:20000),题目要求:
我与梦想有个约会
2023/10/20
1880
5.1 C/C++ 使用文件与指针
C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。
王 瑞
2023/10/10
2920
5.1 C/C++ 使用文件与指针
C语言-学生管理系统
#include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define HEAD_INFO "学号\t姓名\t性别\t年龄\t语文\t数学\t英语\t体育\t总分\t平均分\n" #define HEAD_INFO2 "学号\t姓名\t性别\t年龄\t语文\t数学\t英语\t体育\n" // 定义学生信息数据
天天Lotay
2022/12/02
2.6K0
C语言-学生管理系统
飞机订票系统源代码
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149424.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/04
1.5K0
C和指针学习
这个名字是编译器默认的输出名。如果要修改可执行文件的名字可以加-o参数:gcc -o myexec main.c
Java架构师必看
2021/07/13
3500
c语言学生成绩管理系统(c语言链表实现学生管理系统)
二、目的与要求 每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分 系统菜单: (1)录入学生记录 (2)添加学生记录 (3)删除学生记录 (4)修改学生记录(要求输入密码) (5)查找学生记录(按学号、按姓名) (6)按总分对记录进行降序排列 (7)将当前结果显示或打印,重新保存进数据文件中 (8)输出所有学生信息 (9)计算班级平均分 (10)修改管理员密码(未保存至文件,程序关闭后失效) (11)C语言挂科人数 (0)结束程序
全栈程序员站长
2022/07/25
4.3K0
c语言学生成绩管理系统(c语言链表实现学生管理系统)
【期末复习】⚡考试月来临!C语言复习,这一篇带你逃离挂科区!(完结)
注意:函数就是功能。每一个函数用来实现一个特定的功能。函数的名字应反映出它代表的功能,这样代码的可读性会大大提升
小丞同学
2021/08/16
9660
c语言大丰收游戏源码
#include <graphics.h> #include <conio.h> #include <time.h> #include <stdlib.h> #include <IOSTREAM> #include <STRING> using namespace std; #pragma comment(lib, "msimg32.lib") #pragma comment(lib, "Winmm.lib") // 来自公众号:c语言与cpp编程 void printmenu(); void prin
C语言与CPP编程
2021/01/02
1.4K0
人事管理系统 c语言版
int menu(){ printf(“请按提示输入完毕操作!\n”); printf(“1.查询员工信息\n”); printf(“2.统计员工数量\n”); printf(“3.录入员工信息\n”); printf(“4.删除员工信息\n”); printf(“5.按id排序全部员工\n”); printf(“6.打印全部员工信息\n”); printf(“7.退出系统\n”); return 0;
全栈程序员站长
2022/07/13
1.2K0
人事管理系统 c语言版
C++之结构体和共用体、typedef 指令
memset的方法:https://www.jianshu.com/p/9ba8b9fcb63b
包子388321
2020/06/16
8430
课程设计—飞机订票系统
基于目前人们外出远行频繁,为方便乘客提前买票及优化飞机航空订票服务,需要开发一个飞机订票系统,此程序就是要实现航班情况的录入,查询,订票,退票以及航班的查询和修改等基本功能。
全栈程序员站长
2022/07/02
1.7K0
课程设计—飞机订票系统
【C语言篇】C 语言总复习(下):点亮编程思维,穿越代码的浩瀚星河
在C语言的世界里,结构体和联合体以及文件操作都是非常重要且实用的知识板块,掌握它们能帮助我们更高效地组织数据以及与外部文件进行交互。今天,就让我们一同深入探究这些内容吧。
学无止尽5
2024/12/26
1450
DEVC怎么建工程「建议收藏」
打开文件,选择新建–>项目–>ConsoleApplication(控制台程序),输入项目名,选择保存路径。(单独建一个文件夹存放)
全栈程序员站长
2022/09/20
7710
DEVC怎么建工程「建议收藏」
推荐阅读
相关推荐
C语言实现学生成绩管理系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档