#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;
}
C++类 用组合模式 写文件目录
最新推荐文章于 2025-06-26 09:10:10 发布