MENU

类及对象的存储问题

• January 9, 2021 • Read: 1129 • 学习笔记,C++

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

OA 项目记录:2021-01-09
我的 OA 项目,从一月七号开始,这一两天都在写其注册,登录部分。
注册就涉及到数据的增加,登录就涉及到数据的验证,用户的鉴权,这些都是比较有难度的部分。
在 C 语言中,我们通常使用结构体来存储数据成员,比如 ID,姓名,职位等,而作为 C++,我们通常把这些数据作为数据成员写在中,而我们通过类来处理的该数据类型的变量这就是我们的对象。

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

属性可以看做为数据;行为可以抽象为函数。
对象是数据 和 函数 的集合。
类是指整个一类实物,一个类定义了一个模板;
类对数据以及处理数据的方式(函数)进行封装。
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,姓名,职位等,结构体里面存储的均是数据,我们可以很方便的使用文件相关函数,以二进制方法将结构体写入数据文件:

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

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

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。

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

delete[] p;
p = NULL;

注意:用 new ,一定要 delete..
不说了,腰有点疼...坐太久了。


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

版权属于:字节星球/肥柴之家 (转载请联系作者授权)
原文链接:https://www.bytecho.net/archives/cclass.html
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

Last Modified: February 21, 2024
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment