C++类 用组合模式 写文件目录

本文探讨如何利用C++的组合模式来构建文件目录系统,详细阐述了如何通过面向对象的设计来组合文件和目录,实现递归遍历、添加、删除等操作,以高效地管理文件结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

// 文件(普通文件、目录)基类
class IFile
{
public:
    virtual ~IFile()//虚析构,用于继承类析构
    {}
    virtual void show() = 0;   // 其他操作
    virtual void add(IFile *)    = 0;//添加文件夹、文件
    virtual void remove(IFile *) = 0;//删除文件夹、文件
    virtual list<IFile*>* getChild() = 0;// 获取列表

    virtual string getName() const = 0;
};

// 普通文件
class File:public IFile
{
public:
    File(string name)
    {
        this->name = name;
    }
    string getName() const
    {
        return name;
    }
    virtual void show()
    {
        cout << name << endl;
    }
    virtual void add(IFile *)
    {
        return;
    }
    virtual void remove(IFile *)
    {
        return;
    }
    virtual list<IFile*>* getChild()
    {
        return NULL;
    }

private:
    string name;
};

// 目录   文件夹
class Dir:public IFile
{
public:
    Dir(string name)
    {
        this->name = name;
        _list = new list<IFile*>;
    }
    ~Dir()
    {
        if (_list != NULL)
        {
            while (_list->empty())
            {
                delete *(_list->begin());//析构指针所指向的空间
                _list->erase(_list->begin());//析构指针
            }

            delete _list;
        }

    }

    string getName() const
    {
        return name;
    }
    virtual void show()
    {
        cout << name << endl;
    }
    virtual void add(IFile *file)
    {
        _list->push_back(file);
    }
    virtual void remove(IFile *file)
    {
        _list->remove(file);
    }
    virtual list<IFile*>* getChild()
    {
        return _list;
    }

private:
    string name;
    list<IFile*>*  _list;
};

void func(IFile *dir1 )
{
    IFile *file1 = new File("大黄蜂.mp4");
    IFile *file2 = new File("新喜剧之王.mp4");
    IFile *file3 = new File("死侍.mp4");
    IFile *file4 = new File("哈利波特1.mp4");

    IFile *file7 = new File("面试宝典.pdf");
    IFile *file8 = new File("剑指offer.pdf");
    IFile *file9 = new File("仙剑奇侠传1.exe");

    IFile *file12 = new File("魂斗罗.exe");
    IFile *file13 = new File("超级玛丽.exe");

    IFile *dir2 = new Dir("电影");
    IFile *dir3 = new Dir("哈利波特");
    IFile *dir4 = new Dir("学习");
    IFile *dir5 = new Dir("游戏");
    IFile *dir6 = new Dir("仙剑奇侠传");

    dir1->add(dir2);
    dir1->add(dir4);
    dir1->add(dir5);

    dir2->add(file1);
    dir2->add(file2);
    dir2->add(file3);
    dir2->add(dir3);

    dir3->add(file4);


    dir4->add(file7);
    dir4->add(file8);


    dir5->add(dir6);
    dir5->add(file12);
    dir5->add(file13);

    dir6->add(file11);
}

bool myCompare(const IFile *left, const IFile *right)
{
    return left->getName() < right->getName();
}


void show(IFile *file, int level)
{
    for (int i = 0; i < level; i++)
        cout << "    ";//按照层数打印空格

    // 1、显示自己
    file->show();

    // 2、显示所有子节点
    list<IFile*>* mlist = file->getChild();
    if (mlist != NULL)
    {
        mlist->sort(myCompare);
        list<IFile*>::iterator it = mlist->begin();
        while (it != mlist->end())
        {
            show((*it), level+1);    // 显示子节点
            ++it;
        }
    }
}


int main()
{
    IFile *dir1 = new Dir("D盘");
    func(dir1);

    show(dir1, 0);

    return 0;
}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值